多线程9--- 线程间非实时通信--锁的wait与notify
Posted 黑土白云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程9--- 线程间非实时通信--锁的wait与notify相关的知识,希望对你有一定的参考价值。
1.
1 public class ListAdd1 { 2 private volatile static List list = new ArrayList(); 3 4 public void add(){ 5 list.add("hello"); 6 } 7 8 public int size(){ 9 return list.size(); 10 } 11 12 public static void main(String[] args) { 13 final ListAdd1 list1 = new ListAdd1(); 14 final Object lock = new Object(); 15 Thread t1 = new Thread(new Runnable() { 16 @Override 17 public void run() { 18 synchronized (lock) {//对象锁 19 try { 20 for (int i = 0; i < 10; i++) { 21 list1.add(); 22 System.out.println(Thread.currentThread().getName()+"添加了一个元素..."); 23 Thread.sleep(100); 24 25 if(list1.size() == 5) { 26 System.out.println("发出唤醒通知.."); 27 lock.notify();//不释放当前线程的锁lock, 当前线程继续执行 28 } 29 } 30 } catch (Exception e) { 31 e.printStackTrace(); 32 } 33 } 34 35 } 36 }, "t1"); 37 38 Thread t2 = new Thread(new Runnable() { 39 @Override 40 public void run() { 41 synchronized (lock) { //对象锁 42 if(list1.size() != 5){ 43 try { 44 lock.wait(); //释放锁 45 } catch (InterruptedException e) { 46 e.printStackTrace(); 47 } 48 System.out.println(Thread.currentThread().getName()+"线程停止"); 49 throw new RuntimeException(); 50 } 51 } 52 } 53 }, "t2"); 54 55 t2.start(); //先t2监听,不等于释放锁,被t1拿到,t1加到5发通知,继续等到执行完, t2开始执行! 56 t1.start(); 57 58 /*t1添加了一个元素... 59 t1添加了一个元素... 60 t1添加了一个元素... 61 t1添加了一个元素... 62 t1添加了一个元素... 63 发出唤醒通知.. 64 t1添加了一个元素... 65 t1添加了一个元素... 66 t1添加了一个元素... 67 t1添加了一个元素... 68 t1添加了一个元素... 69 t2线程停止 70 Exception in thread "t2" java.lang.RuntimeException 71 at com.bjsxt.base.thread06.ListAdd1$2.run(ListAdd1.java:54) 72 at java.lang.Thread.run(Thread.java:744)*/ 73 } 74 }
以上是关于多线程9--- 线程间非实时通信--锁的wait与notify的主要内容,如果未能解决你的问题,请参考以下文章
Java多线程通信syncrhoized下wait()/notify()与ReentrantLock下condition的用法比较