CountDownLatchマルチタスクプロセッサ
3010 ワード
CountDownLatchはjavaから提供された同期カウンタであり、字面の意味ではCountDownとLatchの2つの部分に分けることができ、CountDownはカウントの意味であり、Latchはラッチであり、この同期ツールはマルチスレッド環境を保証することによって、ラッチによってメインスレッドの実行を制限し、サブスレッドの実行後にカウントを0に減らし、ラッチが開くまで減少する.メインスレッドが実行されます.
シーン1:メインタスクは、他のサブタスクが完了してから実行されます.
背景:映画館は全員がそろってから映画を放送するのを待っています.映画館のクラスがメインスレッドで、映画を見る人がサブスレッドで、映画館が5人を収容して映画を見ることができると仮定して、次のクラスはCountDownLatchを利用してこの機能を実現します.
実行結果:
この时、现実を考えてみてください.いつでも映画馆が満席で映画を上映するわけではありません.では、时间を设ける必要があります.もし时間になっても人がそろっていなければ、映画を放送し始めます.このプログラムはどう书きますか.
ここではCountDownLatchのawaitのもう一つのリロード方法を用い,CountDownLatchのしきい値を増やし,データの走りやすさを向上させた.結果:
まだ5人が来ていないことに気づいたとき、映画が放送され始めました.素晴らしいのではないでしょうか.ここで注意しなければならないのは、マルチスレッド環境で異常に注意しなければならないことです.異常が発生した場合、データの一貫性をどのように保証するか、メインスレッドがロールバック処理を行うかどうかです.マルチスレッドを用いてパフォーマンスの向上を実現する場合、スレッドのセキュリティに問題があるに違いありません.
シーン1:メインタスクは、他のサブタスクが完了してから実行されます.
背景:映画館は全員がそろってから映画を放送するのを待っています.映画館のクラスがメインスレッドで、映画を見る人がサブスレッドで、映画館が5人を収容して映画を見ることができると仮定して、次のクラスはCountDownLatchを利用してこの機能を実現します.
public class Cinema {
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(5);
ExecutorService executor = Executors.newFixedThreadPool(3);
for(int i=0; i<5; i++){
executor.execute(new Person(countDownLatch));
}
System.out.println(" ...");
// , 0
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" , ...");
}
}
public class Person implements Runnable{
private CountDownLatch countDownLatch;
public Person(CountDownLatch countDownLatch){
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
try {
Thread.sleep((long) (Math.random() * 0));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(String.format("%s ", Thread.currentThread().getId()));
countDownLatch.countDown();
System.out.println(String.format("%s %s ", Thread.currentThread().getId(), countDownLatch.getCount()));
}
}
実行結果:
...
13
11
12
11 3
13 4
12 2
13
11
13 1
, ...
11 0
この时、现実を考えてみてください.いつでも映画馆が満席で映画を上映するわけではありません.では、时间を设ける必要があります.もし时間になっても人がそろっていなければ、映画を放送し始めます.このプログラムはどう书きますか.
public class Cinema {
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(10);
ExecutorService executor = Executors.newFixedThreadPool(3);
for(int i=0; i<5; i++){
executor.execute(new Person(countDownLatch));
}
System.out.println(" ...");
// , 0
try {
countDownLatch.await(300, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" , ...");
}
}
ここではCountDownLatchのawaitのもう一つのリロード方法を用い,CountDownLatchのしきい値を増やし,データの走りやすさを向上させた.結果:
...
12
13
13 8
12 9
11
11 7
12
12 6
13
13 5
, ...
まだ5人が来ていないことに気づいたとき、映画が放送され始めました.素晴らしいのではないでしょうか.ここで注意しなければならないのは、マルチスレッド環境で異常に注意しなければならないことです.異常が発生した場合、データの一貫性をどのように保証するか、メインスレッドがロールバック処理を行うかどうかです.マルチスレッドを用いてパフォーマンスの向上を実現する場合、スレッドのセキュリティに問題があるに違いありません.