生活随笔
收集整理的這篇文章主要介紹了
线程通信wait与notify
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Wait/notify
可以實現線程間的通信
Wait方法,釋放鎖
Notify方法,不釋放鎖
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 Object lock =
new Object();
final CountDownLatch countDownLatch =
new CountDownLatch(
1);Thread t1 =
new Thread(
new Runnable() {
@Overridepublic void run() {
try {
synchronized (lock) {
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();lock.notify();}}}}
catch (InterruptedException e) {e.printStackTrace();}}},
"t1");Thread t2 =
new Thread(
new Runnable() {
@Overridepublic void run() {
synchronized (lock) {
if (list2.size() !=
5) {
try {System.out.println(
"t2進入...");lock.wait();countDownLatch.await();}
catch (InterruptedException e) {e.printStackTrace();}}System.out.println(
"當前線程:" + Thread.currentThread().getName() +
"收到通知線程停止..");
throw new RuntimeException();}}},
"t2");t2.start();t1.start();}}
運行
線程t2執行,wait釋放鎖
線程t1執行,notify并沒有是釋放鎖
等待線程t1,執行完畢
跳出synchronize代碼塊,線程t2才會執行
總結
以上是生活随笔為你收集整理的线程通信wait与notify的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。