使用多线程池执行器的Android
嘿,这里有个有趣的问题。我在我的Android项目中使用了很多sqlite的sql操作。对于这个问题,我使用线程池是为了重用现有资源。线程池如下所示:使用多线程池执行器的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,
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线程是免费的。很抱歉我的英语不好…谢谢你的回答!