生活随笔
收集整理的這篇文章主要介紹了
CountDownLatch实时通信
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CountDownLatch
可以實現線程,實時通信
Await方法,等待
countDown方法,通知
區別
CountDownLatch,不需要配合synchronize使用
Wait/notify,必須配合synchronize使用
package com.bjsxt.base.conn008;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.LinkedBlockingQueue;
/*** wait notfiy 方法,wait釋放鎖,notfiy不釋放鎖**/
public class ListAdd2 {private volatile static List list =
new ArrayList();
public void add(){list.add(
"bjsxt");}
public int size(){
return list.size();}
public static void main(String[] args) {
final ListAdd2 list2 =
new ListAdd2();
final CountDownLatch countDownLatch =
new CountDownLatch(
1);Thread t1 =
new Thread(
new Runnable() {
@Overridepublic void run() {
try {
for(
int i =
0; i <
10; i++){list2.add();System.out.println(
"當前線程:" + Thread.currentThread().getName() +
"添加了一個元素..");Thread.sleep(
500);
if(list2.size() ==
5){System.out.println(
"已經發出通知..");countDownLatch.countDown();}} }
catch (InterruptedException e) {e.printStackTrace();}}},
"t1");Thread t2 =
new Thread(
new Runnable() {
@Overridepublic void run() {
if(list2.size() !=
5){
try {countDownLatch.await();}
catch (InterruptedException e) {e.printStackTrace();}}System.out.println(
"當前線程:" + Thread.currentThread().getName() +
"收到通知線程停止..");
throw new RuntimeException();}},
"t2"); t2.start();t1.start();}}
運行
線程t1,添加了5個元素,發出通知
此時,線程t2會立即執行,不用等到線程t1執行完畢
注意
這里,1表示通知的次數
通知1次,就會喚醒線程t2
總結
以上是生活随笔為你收集整理的CountDownLatch实时通信的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。