Android 使用多个线程池执行器

标签 android multithreading threadpool threadpoolexecutor

嘿,这是一个有趣的问题。我在我的 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/

相关文章:

Android TextView 以及如何确定可见字符数

java - 字符串文字未正确执行

c++ - std线程构造函数是否采用可变线程函数?

C# 多线程按值传递还是引用传递?

asp.net - 如何在 ASP.net MVC 中正确执行异步方法?

java - ExecutorService awaitTermination 方法未按预期执行

java - 等待线程的开销是多少?

java - 为什么我无法导入字符串数组,因为日志中有错误,显示 "java.util.ArrayList cannot be cast to java.lang.CharSequence"

android - TranslateAnimation 完成后跳回起点

c# - 递归和 Rx 并行性