使用多线程池执行器的Android

使用多线程池执行器的Android,android,multithreading,threadpool,threadpoolexecutor,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,

嘿,这里有个有趣的问题。我在我的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());
    }
}
final int NUMBER_OF_CORES=Runtime.getRuntime().availableProcessor();
ThreadPoolExecutor ThreadPoolExecutor=新的ThreadPoolExecutor(内核数*2,内核数*2,1L,时间单位秒,新的ArrayBlockingQueue(12,true),新的优先级线程工厂(进程线程优先级\u后台),新的被拒绝线程(上下文));
公共类PriorityThreadFactory实现ThreadFactory{
私有最终整数优先权;
公共优先级线程工厂(int threadPriority){
mThreadPriority=线程优先级;
}
@凌驾
公共线程newThread(最终可运行){
Runnable wrapperRunnable=new Runnable(){
@凌驾
公开募捐{
试一试{
android.os.Process.setThreadPriority(mThreadPriority);
}捕获(可丢弃的t){
}
runnable.run();
}
};
返回新线程(wrapperRunnable);
}
}
公共类RejectedThread实现RejectedExecutionHandler{
麦洛格麦洛格;
公共拒绝线程(上下文){
this.myLogger=新的myLogger(RejectedThread.class.getSimpleName(),上下文);
}
@凌驾
public void rejectedExecution(可运行工作线程、线程池执行器){
this.myLogger.info(“为:+worker.toString()拒绝执行”);
}
}

我还在为我在数据库中执行的每个CRUD(Create-Read-Update-Delete)操作(由上面的线程池执行)创建一个新的Runnable。下面是问题,除了sql操作的线程池之外,我还需要一个线程池来执行记录器操作,以记录我所创建的其余函数的系统行为。有没有办法防止由于我使用两个或多个线程池执行器(分开分配,用于不同目的,从不在另一个线程池执行器上执行线程池执行器)而造成的任何挤压/(资源不足)

我认为总体上你的想法很好,但你的实施效率有点低

试着自己回答这些问题:

  • 为什么需要两个线程池
  • 你真的需要两个线程池吗
  • 为什么要将核心大小设置为\u个核心的数量*2
  • 为什么将“最大大小”设置为“内核数”*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);
    }
}
执行器返回的默认预配置实现。newCachedThreadPool()像魔术一样工作,我从未遇到过自定义其参数的任何需要

使用此方法的完整教程应用程序可在以下位置找到:


也许这对你也有用?

这一切似乎都太过分了。为什么日志程序操作需要线程池?还有,为什么不能使用AsyncTask类中现有的executor?您对此有什么问题吗?所有的
CRUD
操作都会同步吗?运行线程池不是一个真正的优势吗?[Okas]所有这些日志都会发送到服务,因此此操作总是在后台进行。我正在努力完成一些事情:FielBASH崩溃报告(),但是使用我自己的一个个人服务器,功能较少。[Mark Eng]我认为我有一个很大的进步,因为所有的CRUD操作(对我来说)都是在我总是收到推送通知的情况下完成的。根据我收到的消息,我的应用程序知道要执行什么操作,这样我的ui线程是免费的。很抱歉我的英语不好…谢谢你的回答!