Javaの並行性の高いシリーズ - 日31:スレッドの実行結果を取得し、これらの6つの方法は、あなたが知っていますか?

これは31の高同時実行のJavaのシリーズです。

環境:jdk1.8。

高い同時実行のJavaのシリーズは多くのことを学んできましたが、この記事では、我々は知識が需要を実装するために、以前学んだ使用します。

スレッドで他のスレッドの結果を取得する必要があり、あなたはいくつかの方法を考えることができますか?どのような長所と短所?

この要件と組み合わせることで、我々が使用する6つの方法を以前に学習した知識の見直しを行うために、メモリを強化します。

モード1:join()メソッドの実装をスレッド

コード:

package com.itsoku.chat31;

import java.sql.Time;
import java.util.concurrent.*;

/**
 * 跟着阿里p7学并发,微信公众号:javacode2018
 */
public class Demo1 {
    //用于封装结果
    static class Result<T> {
        T result;

        public T getResult() {
            return result;
        }

        public void setResult(T result) {
            this.result = result;
        }
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println(System.currentTimeMillis());
        //用于存放子线程执行的结果
        Result<Integer> result = new Result<>();
        //创建一个子线程
        Thread thread = new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
                result.setResult(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        thread.start();
        //让主线程等待thread线程执行完毕之后再继续,join方法会让当前线程阻塞
        thread.join();

        //获取thread线程的执行结果
        Integer rs = result.getResult();
        System.out.println(System.currentTimeMillis());
        System.out.println(System.currentTimeMillis() + ":" + rs);
    }
}

出力:

1566733162636
1566733165692
1566733165692:10

メインスレッドは、メソッドへの参加、スレッド後のスレッドが終了する現在の方法は、参加遮断することにより、コードが続行されます。

道に参加する他のスレッドでも、結果のスレッドスレッドを取得するために必要なメソッドを助けるために何もしない参加する場合は、あなただけのスレッドをブロックすることができます。

:()メソッドについて、より詳細にスレッドの使用に参加し、参照することができ、スレッドの基本的な操作

モード2:達成されたCountDownLatch

コード:

package com.itsoku.chat31;

import java.util.concurrent.*;

/**
 * 跟着阿里p7学并发,微信公众号:javacode2018
 */
public class Demo2 {
    //用于封装结果
    static class Result<T> {
        T result;

        public T getResult() {
            return result;
        }

        public void setResult(T result) {
            this.result = result;
        }
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println(System.currentTimeMillis());
        CountDownLatch countDownLatch = new CountDownLatch(1);
        //用于存放子线程执行的结果
        Demo1.Result<Integer> result = new Demo1.Result<>();
        //创建一个子线程
        Thread thread = new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
                result.setResult(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                countDownLatch.countDown();
            }
        });
        thread.start();
        //countDownLatch.await()会让当前线程阻塞,当countDownLatch中的计数器变为0的时候,await方法会返回
        countDownLatch.await();

        //获取thread线程的执行结果
        Integer rs = result.getResult();
        System.out.println(System.currentTimeMillis());
        System.out.println(System.currentTimeMillis() + ":" + rs);
    }
}

出力:

1566733720406
1566733723453
1566733723453:10

上記のコードはまた、所望の結果を達成している、使用はCountDownLatch、1つ以上のスレッドが自分の完了後にスレッドの数を待ってから、継続することができますCountDownLatch。詳しくは見JUCが完了したCountDownLatchマルチスレッディングツールを待って、必要なスキルを

モード3:ExecutorService.submitメソッドの実装

コード:

package com.itsoku.chat31;

import java.util.concurrent.*;

/**
 * 跟着阿里p7学并发,微信公众号:javacode2018
 */
public class Demo3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建一个线程池
        ExecutorService executorService = Executors.newCachedThreadPool();
        System.out.println(System.currentTimeMillis());
        Future<Integer> future = executorService.submit(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 10;
        });
        //关闭线程池
        executorService.shutdown();
        System.out.println(System.currentTimeMillis());
        Integer result = future.get();
        System.out.println(System.currentTimeMillis() + ":" + result);
    }
}

出力:

1566734119938
1566734119989
1566734122989:10

使い方ExecutorService.submitこのメソッドが返す、メソッドが実装されFuturefuture.get()タスクは将来の関連付けを実行するために完了するまで、現在のスレッドをブロックするようにしましょう。

知識:

  1. JAVAスレッドプール、この1つは十分です
  2. エグゼキュータに詳述JUCフレーム1
  3. エグゼキュータに詳述JUCフレーム2

モード4:FutureTaskモード1

コード:

package com.itsoku.chat31;

import java.util.concurrent.*;

/**
 * 跟着阿里p7学并发,微信公众号:javacode2018
 */
public class Demo4 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println(System.currentTimeMillis());
        //创建一个FutureTask
        FutureTask<Integer> futureTask = new FutureTask<>(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 10;
        });
        //将futureTask传递一个线程运行
        new Thread(futureTask).start();
        System.out.println(System.currentTimeMillis());
        //futureTask.get()会阻塞当前线程,直到futureTask执行完毕
        Integer result = futureTask.get();
        System.out.println(System.currentTimeMillis() + ":" + result);
    }
}

出力:

1566736350314
1566736350358
1566736353360:10

コードで使用FutureTask実装、FutureTaskを実装Runnableインタフェース、および内部の戻り値を、それがスレッドの実行に直接渡すことができるfutureTask.get()まで、現在のスレッドをブロックFutureTaskタスクは、コンストラクタパスの実装を完了すると、メソッドが返す得ます。FutureTask詳細は、以下を参照してください:キュータフレームワークJUCコメント数1

モード5:FutureTask、実施例2

コード:

package com.itsoku.chat31;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

/**
 * 跟着阿里p7学并发,微信公众号:javacode2018
 */
public class Demo5 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println(System.currentTimeMillis());
        //创建一个FutureTask
        FutureTask<Integer> futureTask = new FutureTask<>(() -> 10);
        //将futureTask传递一个线程运行
        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            futureTask.run();
        }).start();
        System.out.println(System.currentTimeMillis());
        //futureTask.get()会阻塞当前线程,直到futureTask执行完毕
        Integer result = futureTask.get();
        System.out.println(System.currentTimeMillis() + ":" + result);
    }
}

出力:

1566736319925
1566736319970
1566736322972:10

作成しFutureTaskたオブジェクトを、呼び出しはfutureTask.get()子供が3秒間休止中のスレッド、現在のスレッドをブロックし、次に呼び出しますfutureTask.run();完成し、後futureTask run()メソッドをfutureTask.get()遮断するから復帰します。

注:このようにして4道異なる点。

FutureTask詳細は、以下を参照してください:キュータフレームワークJUCコメント数1

ウェイ6:CompletableFutureの仕方

コード:

package com.itsoku.chat31;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

/**
 * 跟着阿里p7学并发,微信公众号:javacode2018
 */
public class Demo6 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println(System.currentTimeMillis());
        CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 10;
        });
        System.out.println(System.currentTimeMillis());
        //futureTask.get()会阻塞当前线程,直到futureTask执行完毕
        Integer result = completableFuture.get();
        System.out.println(System.currentTimeMillis() + ":" + result);
    }
}

出力:

1566736205348
1566736205428
1566736208429:10

CompletableFuture.supplyAsync呼び出し、戻り値との非同期タスクを実行するために使用することができますcompletableFuture.get()

タスクが終了するまで現在のスレッドをブロックは、方法が返されますます。

CompletableFutureより詳細な使用方法は、以下を参照してくださいJUCツールCompletableFutureで、必要不可欠なスキルを

高い同時実行ディレクトリのjavaのシリーズ

  1. 1日目:あなたは、いくつかの概念を知っている必要があります
  2. 2日目:同時実行レベル
  3. 3日目:関連する並列の二つの重要な法則
  4. 4日目:JMM関連する概念
  5. 5日目:プロセスとスレッドの深い理解
  6. 基本的な操作のスレッド:6日目
  7. 7日目:揮発性およびJavaのメモリモデル
  8. 8日目:スレッドグループ
  9. 9日目:ユーザスレッドとスレッドガード
  10. 10日目:スレッドセーフとsynchronizedキーワード
  11. 11日目:いくつかの方法で中断されたスレッド
  12. 12日目JUC:ReentrantLockのリエントラントロック
  13. 13日目:JUC条件内のオブジェクト
  14. 14日目:JUC LockSupportツール、必要不可欠なスキル
  15. 15日目:JUCでセマフォ(セマフォ)
  16. 16日目:JUCは、完成したCountDownLatchマルチスレッドツールで必要なスキルを待っています
  17. 17日目:JUC 6 CyclicBarrierを種類のシーンでは、円形のフェンス
  18. 18日目:JAVAスレッドプール、これで十分です
  19. 19日目:キュータでJUC詳細なフレーム1
  20. 20日目:キュータでJUC詳細フレーム2
  21. 21日目:CASでのJavaは、あなたが知っている必要があります
  22. 22日目:JUC基礎となるツールは安全でない、マスターが理解しなければなりません
  23. 23日目:JUCクラス原子、十分
  24. 24日目:ThreadLocalを、InheritableThreadLocal(理解しやすいです)
  25. 25日目:ブロックキューのJUC把握
  26. 最初の26:JUCの共通セットを使用することを学ぶ、しばしば見て!
  27. 27日目:そう単純で実際の記事、インターフェース、パフォーマンス時間
  28. 28日目:実際の記事、痛みマイクロサービスは、あなたが取り除く手助けするために一緒に記録します
  29. 29日目:同時高いコモンモード電流制限
  30. 30日目:JUCツールでCompletableFuture、必要不可欠なスキル

学校でのアリのp7同時公開番号:通行人Javaは、毎日最新の記事を入手!

おすすめ

転載: www.cnblogs.com/itsoku123/p/11412765.html