gpt4 book ai didi

Android 使用多个线程池执行器

转载 作者:行者123 更新时间:2023-11-30 00:43:39 39 4
gpt4 key购买 nike

嘿,这是一个有趣的问题。我在我的 Android 项目中使用了很多 sqlite 的 sql 操作。为此,我正在使用线程池以重用现有资源。线程池看起来像这样:

final int NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors();
ThreadPoolExecutor threadPoolExecutor= new ThreadPoolExecutor(NUMBER_OF_CORES*2,NUMBER_OF_CORES*2,1L, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(12,true),new PriorityThreadFactory(Process.THREAD_PRIORITY_BACKGROUND),new RejectedThread(context));



public class PriorityThreadFactory implements ThreadFactory {

private final int mThreadPriority;

public PriorityThreadFactory(int threadPriority) {
mThreadPriority = threadPriority;
}

@Override
public Thread newThread(final Runnable runnable) {
Runnable wrapperRunnable = new Runnable() {
@Override
public void run() {
try {
android.os.Process.setThreadPriority(mThreadPriority);
} catch (Throwable t) {

}
runnable.run();
}
};
return new Thread(wrapperRunnable);
}

}




public class RejectedThread implements RejectedExecutionHandler {

MyLogger myLogger;

public RejectedThread(Context context) {
this.myLogger=new MyLogger(RejectedThread.class.getSimpleName(), context);
}

@Override
public void rejectedExecution(Runnable worker, ThreadPoolExecutor executor) {
this.myLogger.info("Execution rejected for: "+worker.toString());
}
}

我还为我在数据库中执行的每个 CRUD(创建-读取-更新-删除)操作创建了一个新的 Runnable(由上面的线程池执行)。这里的问题是,除了用于 sql 操作的线程池之外,我还需要一个线程池来执行记录器操作,以记录我创建的其余函数的系统行为。有没有一种方法可以防止任何挤压/(资源不足),因为我正在使用两个或多个线程池执行器(分开分配,用于不同目的并且从不在另一个线程池执行器上执行线程池执行器)?

最佳答案

我觉得总的来说你的想法很好,但是你的实现有点低效。

试着自己回答这些问题:

  • 为什么需要两个线程池?
  • 您真的需要两个线程池吗?
  • 为什么将 CORE 大小设置为 NUMBER_OF_CORES*2?
  • 为什么将 MAX 大小设置为 NUMBER_OF_CORES*2?
  • 您真的需要覆盖线程优先级吗?

根据我的经验,上述复杂情况都不是真正必要的。

例如,在我所有的应用程序中,我都使用 BackgroundThreadPoster 类的单个实例,以便将工作卸载到后台线程。该类非常简单:

/**
* A single instance of this class should be used whenever we need to post anything to a (random) background thread.
*/
public class BackgroundThreadPoster {

ExecutorService mExecutorService = Executors.newCachedThreadPool();

public void post(Runnable runnable) {
mExecutorService.execute(runnable);
}
}

Executors.newCachedThreadPool() 返回的默认预配置实现就像魔术一样工作,我从未遇到过任何需要自定义其参数的情况。

可在此处找到使用此方法的完整教程应用程序:https://github.com/techyourchance/android_mvc_tutorial

也许这对你也有用?

关于Android 使用多个线程池执行器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42157344/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com