JDK 中关于wait,notify这两个方法的介绍:
1、wait:导致当前线程等待,直到另一个线程调用该对象的notify()
方法或notifyAll()
方法。并且释放锁(Thread.sleep()不释放锁)。后续的代码,不执行。
2、notify:唤醒线程。后续的代码继续执行。
注意的点:
1、使用这两个方法,必须拥有对象的监视器。
2、线程在执行完wait方法后,进入阻塞,释放锁。
3、执行notify方法后,唤醒执行wait方法的线程,执行wait之后的代码逻辑。
示例:
import java.util.ArrayList; import java.util.List; public class wait_and_notify { public static void main(String[] args) { List<Long> lists = new ArrayList<Long>(); Producer p = new Producer(lists); //构造方法进行对象的传递,下同 Consumer c = new Consumer(lists); new Thread(p).start(); new Thread(c).start(); } } class Producer implements Runnable { private long i = 0 ; List<Long> lists; private Producer producer; public Producer(List<Long> lists) { this.lists = lists; } @Override public void run() { while (true){ synchronized (lists){ if(lists.size() > 10){ lists.notifyAll(); System.out.println("生成者满了"); try { lists.wait();//后续方法不执行了,等到再次获取cpu时间片,才接着输出 "wait invoke" System.out.println("wait invoke!"); } catch (InterruptedException e) { e.printStackTrace(); } }else{ lists.add(i++); System.out.println("添加:"+i); } } } } } class Consumer implements Runnable { List<Long> lists; public Consumer(List<Long> lists) { this.lists = lists; } @Override public void run() { while (true){ synchronized (lists){ if(lists.size() <= 0){ lists.notifyAll(); //后续方法继续执行 System.out.println("消费者空了"); try { lists.wait(); System.out.println("Consumer wait invoke!"); } catch (InterruptedException e) { e.printStackTrace(); } }else{ System.out.println(lists.remove(0)); } } } } }