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来分担该工作负载?