Android CPU核心线程数

时间:2015-11-29 07:47:06

标签: android count threadpool cpu-cores

要获得核心数量,我们可以在代码行下面使用

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;

我无法理解

  1. 没有超线程检查我们如何乘以2
  2. 为什么+1
  3. 修改

    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

    所以我们可以创建如此多的线程而不是为什么需要上面的计算?

0 个答案:

没有答案