Android 使用多个线程池执行器

Android using multiple threadpoolexecutors

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

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 操作的线程池之外,我还需要一个线程池来执行记录器操作,以记录我创建的其余函数的系统行为。有没有办法防止任何挤压/(资源不足),因为我正在使用两个或多个线程池执行程序(分开分配,用于不同的目的,并且 never 在另一个线程池执行程序上执行线程池执行器)?

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

试着自己回答这些问题:

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

根据我的经验,none 以上并发症确实是必要的。

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

/**
 * 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() 返回的默认 pre-configured 实现就像魔术一样工作,我从未遇到过需要自定义其参数的情况。

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

也许这对你也有用?