スレッドプール、未来とCompletableFutureを作成するためのマルチスレッド方法

みなさん、こんにちは、私はアヒル午前:

     複数のスレッドを作成して使用するにはいくつかの方法についての今日の話。

1.スレッド和Runnableを


    クラス継承を通し、Runnableを実装します。
    この例では、子ではありません。

2.スレッドプール


  今、スレッドプールの5種類があります。

  //缓存线程池
  ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); 
  //固定大小线程池
  ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
  //单线程执行
  ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
  //定时或延迟执行
  ExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(10);
  //窃取线程池
  ExecutorService workStealingPool = Executors.newWorkStealingPool();

どのnewWorkStealingPoolは、過度のダウンタイムのプロジェクトのためにCPUの使用を有効にし、過剰なスレッドプールを防止するために、1.8の後に新しいJDKです。複数のタスクを実行するように構成し、各タスクにはあまり時間がかかります。
  残りの4つの方法は、ダウンタイムが発生した過度によって引き起こされるプロジェクトのCPUを占有する可能性があります。
  4コア16G機、例えば、スレッドプールのサイズは、このようにExecutors.newFixedThreadPool(10)を作成し10でした
  Executors.newWorkStealingPool()は、スレッドプールのサイズは4で作成します。一般的に、核と同等の数
  でも、このようなし、核* 2の数を超えないようお勧めします。(特定の要件を参照してください)


3.今後の和CompletableFuture


将来的にはJDK1.5、非同期マルチスレッドの後に登場しています。
例:

// 创建Future集合,用于存放完成的Future
List<Future<Long>> futureList = new ArrayList();
//多线程执行任务
for (int i = 0; i < 100; i++) {
    Future<Long> testFuture= workStealingPool.submit(new Callable<Long>() {
        @Override
        public Long call() {
            //模拟执行耗时任务
            System.out.println("task 1 doing...");
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return 0L;
        }
    });
    futureList.add(testFuture);
}
//遍历list,获取线程结果
for (Future<Long> taskResponseFuture: futureList) {
    if(taskResponseFuture.get().equals(0L)){
        //当前future执行完毕
    }
}

ここで注意し、Future.get()ブロックメソッドですあなたはマルチスレッド操作を実行する必要がある場合は、最後の時間にget()メソッドを実行します。
同様のトップの例としては、今後、複数のリサイクルGETのリストに入れられます。

CompletableFutureは、非同期のマルチスレッドは、より多くのAPIを提供しに、ここでいくつかの一般的に使用され、実装クラスの未来です。


supplyAsync非同期実行は、戻り値があります

CompletableFuture<Integer> completableFuture1 = CompletableFuture.supplyAsync(() -> {
  //模拟执行耗时任务
  System.out.println("task 1 doing...");
  try {
      Thread.sleep(1000);
  } catch (Exception e) {
      e.printStackTrace();
  }
  //返回结果
  return 0;
});

この段階で入力として受信thenAccept出力段。マルチスレッド(シングルスレッド)の実行順序。

completableFuture1.thenApply(new Function<Integer, Object>() {
    @Override
    public Object apply(Integer integer) {
        //模拟执行耗时任务
        System.out.println("task thenApply doing...");
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }
});

whenComplete非同期モニター結果

completableFuture1.whenComplete(new BiConsumer<Integer,Throwable>() {
    @Override
    public void accept(Integer o, Throwable o2) {
        if(o == 0L){
            System.out.println("task complete...");
        }else{
            throw new RuntimeException();
        }
    }
});

 

公開された115元の記事 ウォン称賛58 ビュー23万+

おすすめ

転載: blog.csdn.net/Angry_Mills/article/details/88624776