要获得核心数量,我们可以在代码行下面使用
int CPU_COUNT = Runtime.getRuntime().availableProcessors()
如果设备支持超线程(HT)而不是
int MAXIMUM_POOL_SIZE = CPU_COUNT * 2;
现在,让我们看看用于创建线程池的AsyncTask统计信息
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
我无法理解
修改
private AtomicInteger mThreadCount = new AtomicInteger(1);
private final int MAX_THREAD_COUNT = 1950; //Runtime.getRuntime().availableProcessors() * 2;
private ThreadFactory mThreadFactory = new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "KoreThread #" + mThreadCount.getAndIncrement());
}
};
private ExecutorService mExecutorService = Executors.newFixedThreadPool(MAX_THREAD_COUNT, mThreadFactory);
private void produceMaxThreadCountException() {
for (int i = 0; i < 10000; i++) {
mExecutorService.execute(mRunnable);
new Thread(mRunnable, "KoreThread #" + mThreadCount.getAndIncrement()).start();
}
}
我在两种情况下都检查了这个特权
发
java.lang.OutOfMemoryError:pthread_create(1040KB堆栈)失败:尝试 再次
致命信号6(SIGABRT),tid 21258中的代码-6(KoreThread#206)
在KoreThread#2058之后
线程池
分配:394:无法为其分配内存页面 adreno_pool_allocator。
致命信号11(SIGSEGV),代码2,故障地址0xb600822e in tid 9695 (RenderThread)
对于线程数1950
所以我们可以创建如此多的线程而不是为什么需要上面的计算?