【问题标题】:Potential overload while using Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());使用 Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()) 时的潜在过载;
【发布时间】:2015-11-10 17:12:12
【问题描述】:

我正在尝试使用多线程调用一个方法超过一百万次。所以我使用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());            
    }

【问题讨论】:

  • 这是在启动数千个线程 什么?你为什么这么认为?

标签: java multithreading memory-management


【解决方案1】:

这将创建Runtime.getRuntime().availableProcessors() 线程。

无论您向它提交多少任务,当它们可用时,它们只会排队并由这些线程处理。

也就是说,尽管您对Future 的使用似乎有点奇怪,但您所做的一切都很好。很可能有一种更有效的方法可以做到这一点,但你正在做的事情会奏效。

【讨论】:

  • 我做了适当的改变,想用future为我打印无效的对象。每个它有时如何返回几个空值
猜你喜欢
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多