使用Executors.newFixedThreadPool时的潜在重载(Runtime.getRuntime()。availableProcessors());

时间:2015-11-10 17:12:13

标签: java multithreading memory-management

我正在尝试使用多线程来调用方法超过一百万次。所以我使用ExecutorService并将newFixedThreadPool传递给动态值:

Runtime.getRuntime().availableProcessors()

这是启动数千个线程,这会导致处理器负载过重吗?或者可以选择它吗?

ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
ArrayList<Future<Boolean>> arrList = new ArrayList<Future<Boolean>>();
    for (final Vlaue val : List) {

        arrList.add(service.submit(new Callable() {
            @Override
            public Boolean call() throws Exception {

                Object obj = client.findObj(
                        val.getItem1(),val.getItem2());
                return obj.isValid();
            }
        }));

    }
    service.shutdown();
    for (Future future : arrList) {
        // at time future returns null here, not sure why?
        assertTrue("Invalid object" future.get());            
    }

1 个答案:

答案 0 :(得分:1)

这将创建Runtime.getRuntime().availableProcessors()个帖子。

无论你提交多少个任务,它们都会在这些线程可用时排队等待并处理。

所以换句话说,尽管你对Future的使用看起来有些奇怪,但你所做的却很好。很有可能是一种更有效的方法,但你正在做的事情会奏效。