我想与ThreadPoolExecutor
并行地从sdcard读取多个文件。选择Threads
数量的最佳方法是什么?是否可以根据可用处理器的数量选择大小?
最佳答案
根据处理器的数量选择Threads
的数量是一个很好的解决方案,因为它会根据运行该应用程序的设备的硬件进行扩展。一个很好的例子可以在AsyncTask
的source code中找到:
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final int KEEP_ALIVE = 1;
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
}
};
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(128);
public static final Executor THREAD_POOL_EXECUTOR
= new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
我认为这是最佳实践解决方案。
如果您想更好地了解他们如何使用
AsyncTask
,可以查看ThreadPoolExecutor
的源代码here。关于java - 如何在Android上选择线程池的大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30294794/