Java 仅当一个/多个工作线程可用时创建和添加Runnable。。?

Java 仅当一个/多个工作线程可用时创建和添加Runnable。。?,java,multithreading,threadpool,executorservice,executor,Java,Multithreading,Threadpool,Executorservice,Executor,我正在执行数以百万计的迭代,我想将其并行化。因此决定将任务[每次迭代]添加到线程池中 现在,如果我将所有迭代添加到线程池,它可能会抛出一个OutOfMemoryError。我想优雅地处理这个问题,那么有没有办法知道线程池中工作线程的可用性呢 一旦可用,将Runnable添加到工作线程 for(int i=0; i<10000000000; i++) { executor.submit(new Task(i)); } for(inti=0;i您应该使用java.lang. 最大的

我正在执行数以百万计的迭代,我想将其并行化。因此决定将任务[每次迭代]添加到线程池中

现在,如果我将所有迭代添加到线程池,它可能会抛出一个
OutOfMemoryError
。我想优雅地处理这个问题,那么有没有办法知道线程池中工作线程的可用性呢

一旦可用,将
Runnable
添加到工作线程

for(int i=0; i<10000000000; i++) {
     executor.submit(new Task(i));
}

for(inti=0;i您应该使用
java.lang.


最大的内存问题可能是您的对象创建,而不是将它们添加到执行器中,因此您应该在这里调用
Runtime.getRuntime().freemory()

为什么不设置并发运行的任务数限制。例如:

HashSet<Future> futures = new HashSet<>();
int concurrentTasks = 1000;

for (int ii=0; ii<100000000; ii++) {
    while(concurrentTasks-- > 0 && ii<100000000) {
        concurrentTasks.add(executor.submit(new Task(ii)));
    }
    Iterator<Future> it = concurrentTasks.iterator();
    while(it.hasNext()) {
        Future task = it.next();
        if (task.isDone()) {
            concurrentTasks++;
            it.remove();
        }
    }
}
HashSet futures=newhashset();
int concurrentTasks=1000;

对于(int ii=0;ii 0&&ii,您需要使用如下内容:

ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(MAX_PENDING_TASKS);
Executor executor = new ThreadPoolExecutor(MIN_THREADS, MAX_THREADS, IDLE_TIMEOUT, TimeUnit.SECONDS, queue, new ThreadPoolExecutor.CallerRunsPolicy());

for(int i=0; i<10000000000; i++) {
  executor.submit(new Task(i));
}
ArrayBlockingQueue=新的ArrayBlockingQueue(最大待定任务);
Executor Executor=new ThreadPoolExecutor(最小线程、最大线程、空闲超时、TimeUnit.SECONDS、队列、new ThreadPoolExecutor.CallerRunPolicy());

对于(int i=0;iA线程池附带了一个任务队列。一旦队列已满,它可以拒绝任务,或阻止任务提交线程。阅读javadoc:我想创建一个这样的任务,假设我有自己的单独队列,其中包含足够的数据来创建任务[runnable]..如果工作线程可用,我将从队列中取出数据..然后从该数据创建一个runnable并将其添加到executor中。抱歉,我刚刚意识到,拒绝策略中没有一个包含阻止调用线程的策略。也就是说,CallerRunPolicy可以满足您的需要。另请参阅每秒执行100亿个任务超过316年的计算时间。您需要分配多少CPU来分担该工作负载?