我正在关键应用:
CompletableFuture
.delayedExecutor(1, TimeUnit.MILLISECONDS).execute(() -> {});
从我在线阅读,是很常见的这种使用一个新线程每次呼叫。我想知道如果有一种方法重新使用一个线程,而不是创建新线程的?
更新:
我并不清楚 - 我想用CompletableFuture
,但我想CompletableFuture
重用,而不是管理自己的线程某线程。
我看这个问题:CompletableFuture reuse thread from pool
但建议使用环境变量 - 我想知道是否有一种方法以编程方式做到这一点。
从我在线阅读,是很常见的这种使用一个新线程每次呼叫。
(1)这是唯一的情况下,如果机器不支持并行或你做它不是通过设置系统属性java.util.concurrent.ForkJoinPool.common.parallelism
到0
或1
支持。
8个处理器
(2)如果该机器不支持并行,ForkJoinPool.commonPool()
的使用量和并行级别设置,我想,到可用处理器的数量(其可以由Runtime#availableProcessors
确定)。
在8个处理器的情况下,7-8线程可能会被创建以服务于共同ForkJoinPool
。
我想用
CompletableFuture
,但我想CompletableFuture
重用,而不是管理自己的线程某线程。
甲DelayedExecutor
只是提交任务到底层Executor
,其或者是一个ThreadPerTaskExecutor
(1)或一个ForkJoinPool
(2)。
幸运的是,你可以手动指定将由Executor
被用于任务委派给一个DelayedExecutor
。
Executor delayedExecutor =
CompletableFuture.delayedExecutor(1, TimeUnit.MILLISECONDS, executor);
它让我们回到your previous question,在那里我pointed out,一个Executor
可以用ThreadFactory
定义。
Executor executor = Executors.newCachedThreadPool(YourThreadClass::new);
执行新的线程为每个组任务创建
遗嘱执行人通常用来明确创建线程,而不是。例如,而不是调用新主题(新的(RunnableTask()))开始()为每一个组任务,您可以使用:每个一组任务的
Executor executor = anExecutor;
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());
所以,如果你想重用线程,通过使用ExecutorService
或ThreadPoolExecutor
,所以从池中的一个线程将执行运行任务创建一个线程池。
如果所有线程都很忙,任务将排队到一定的极限,之后将通过RejectedExecutionException
遭到拒绝。
例
public class NewMain {
private static final ExecutorService ex = Executors.newFixedThreadPool(3);
public static void main(String[] args) {
Runnable r = () -> System.out.println(Thread.currentThread().getName());
ex.execute(r);
CompletableFuture<Void> c = CompletableFuture.runAsync(r, ex);
}
}
JDK-8使用CompletableFuture.runAsync
并通过可运行,执行器
公共静态CompletableFuture runAsync(供应商的供应商,遗嘱执行人执行人)
返回一个新CompletableFuture是通过异步在给定的执行程序运行时它运行在给定的动作后任务完成。