突撃同時プログラミングJUCシリーズ-同時ツールSemaphore
突撃同時プログラミングJUCシリーズデモンストレーションコードアドレス:
https://github.com/mtcarpenter/JavaTutorial
前の2つの章では、
新日学校の植樹祭の活動では、植樹祭の場所は途中で信号の交差点を通過しなければならない.信号の交差点は毎回時間が限られている.信号の時間は2年生の同級生しか通過できない.例は以下の通りである.
実行結果は次のとおりです.
このコードを実行すると、コンソールが見つかり、2つのサブスレッドが同時に印刷されます.
私は小春兄で、Javaのバックエンドの开発に従事して、少しのフロントエンド、シリーズの技术の文章を出力し続けることを通じて文会友を通じて、もし本文があなたのために助けを提供することができるならば、みんなの関心、称賛、分かち合う支持を歓迎しますまた今度ね!
https://github.com/mtcarpenter/JavaTutorial
前の2つの章では、
CountDownLatch
とCyclicBarrier
を学びました.彼らはいずれも減算同期器で、今日はインクリメンタル同期器Semaphore
を学びました.Semaphore
(信号量)は、各スレッドを調整することによって、共通リソースの合理的な使用を保証するために、特定のリソースに同時にアクセスするスレッドの数を制御するために使用される.この信号量を見ると、私の頭の中に信号が出てきました.学生の安全を保証するために、学校の交差点には信号が設置されていて、車の流量がコントロールされていて、信号が同時に100台の車を通行することができて、信号が通行していない車は次の信号まで渋滞しています.新日学校の植樹祭の活動では、植樹祭の場所は途中で信号の交差点を通過しなければならない.信号の交差点は毎回時間が限られている.信号の時間は2年生の同級生しか通過できない.例は以下の通りである.
public class SemaphoreExample1 {
private final static int gradeNum = 6;
private static Semaphore semaphore = new Semaphore(2);
public static void main(String[] args) throws Exception {
ExecutorService exec = Executors.newScheduledThreadPool(gradeNum);
System.out.println(" .....");
for (int i = 0; i < gradeNum; i++) {
int gradeName = i + 1;
exec.submit(() -> {
try {
//
semaphore.acquire();
wait(gradeName);
//
semaphore.release();
} catch (Exception e) {
}
});
}
exec.shutdown();
}
private static void wait(int gradeName) throws Exception {
TimeUnit.SECONDS.sleep(1);
System.out.println(gradeName + " ......");
}
}
実行結果は次のとおりです.
.....
1 ......
2 ......
4 ......
3 ......
5 ......
6 ......
このコードを実行すると、コンソールが見つかり、2つのサブスレッドが同時に印刷されます.
私は小春兄で、Javaのバックエンドの开発に従事して、少しのフロントエンド、シリーズの技术の文章を出力し続けることを通じて文会友を通じて、もし本文があなたのために助けを提供することができるならば、みんなの関心、称賛、分かち合う支持を歓迎しますまた今度ね!