- Wait和notify方法必须配合synchronized关键字使用。
- Wait方法释放锁,notify方法不释放锁。
- public class ListAdd1 {
- 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) {
- //1 实例化出来一个 lock
- // 当使用wait 和 notify 的时候 , 一定要配合着synchronized关键字去使用
- final Object lock = new Object();
- final ListAdd1 list1 = new ListAdd1();
- Thread t1 = new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- synchronized(lock) {
- for(int i = 0; i <10; i++){
- list1.add();
- System.out.println("当前线程:" + Thread.currentThread().getName() + "添加了一个元素..");
- Thread.sleep(500);
- if(list1.size()==5) {
- System.out.println("已经发出通知");
- lock.notify();
- }
- } }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }, "t1");
- Thread t2 = new Thread(new Runnable() {
- @Override
- public void run() {
- while(true){
- synchronized (lock) {
- if(list1.size() != 5){
- System.out.println("t2进入.....");
- try {
- lock.wait();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println("当前线程收到通知:" + Thread.currentThread().getName() + " list size = 5 线程停止..");
- throw new RuntimeException();
- }
- }
- }
- }
- }, "t2");
- t2.start();
- t1.start();
- }
- }
- 输出结果:t2先执行,由于wait()方法会释放锁,交给t1执行,当t1添加了5个元素,向t2发出通知,调用notify()方法,notify方法不会释放锁,所以等t1执行完,t2在执行。
- t2进入.....
- 当前线程:t1添加了一个元素..
- 当前线程:t1添加了一个元素..
- 当前线程:t1添加了一个元素..
- 当前线程:t1添加了一个元素..
- 当前线程:t1添加了一个元素..
- 已经发出通知
- 当前线程:t1添加了一个元素..
- 当前线程:t1添加了一个元素..
- 当前线程:t1添加了一个元素..
- 当前线程:t1添加了一个元素..
- 当前线程:t1添加了一个元素..
- 当前线程收到通知:t2 list size = 5 线程停止..
- Exception in thread "t2" java.lang.RuntimeException
- at com.bjsxt.base.conn008.ListAdd1$2.run(ListAdd1.java:59)
- at java.lang.Thread.run(Thread.java:745)
7.wait/notify方法。
