强制重新使用线程通过CompletableFuture

问题描述 投票:2回答:2

我正在关键应用:

 CompletableFuture
  .delayedExecutor(1, TimeUnit.MILLISECONDS).execute(() -> {});

从我在线阅读,是很常见的这种使用一个新线程每次呼叫。我想知道如果有一种方法重新使用一个线程,而不是创建新线程的?

更新:

我并不清楚 - 我想用CompletableFuture,但我想CompletableFuture重用,而不是管理自己的线程某线程。

我看这个问题:CompletableFuture reuse thread from pool

但建议使用环境变量 - 我想知道是否有一种方法以编程方式做到这一点。

java multithreading executorservice threadpoolexecutor completable-future
2个回答
1
投票

从我在线阅读,是很常见的这种使用一个新线程每次呼叫。

(1)这是唯一的情况下,如果机器不支持并行或你做它不是通过设置系统属性java.util.concurrent.ForkJoinPool.common.parallelism01支持。

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);

1
投票

执行新的线程为每个组任务创建

遗嘱执行人通常用来明确创建线程,而不是。例如,而不是调用新主题(新的(RunnableTask()))开始()为每一个组任务,您可以使用:每个一组任务的

Executor executor = anExecutor;
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());

所以,如果你想重用线程,通过使用ExecutorServiceThreadPoolExecutor,所以从池中的一个线程将执行运行任务创建一个线程池。

如果所有线程都很忙,任务将排队到一定的极限,之后将通过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是通过异步在给定的执行程序运行时它运行在给定的动作后任务完成。

© www.soinside.com 2019 - 2024. All rights reserved.