Object.wait() -挂起一个线程 Object.notify() -唤醒一个线程
class Source { public int count = 0; public boolean flag = false; // 是否有数据 } class Producer implements Runnable { private Source source; public Producer(Source source) { this.source = source; } @Override public void run() { while (true) { synchronized(source) { if(!source.flag) { source.count++; source.flag = true; System.out.println("生产商品:"+source.count); source.notify(); // 唤醒另一线程 } else { try { source.wait(); // 等前线程等待 } catch (InterruptedException e) { e.printStackTrace(); } } } } } } class Comsumer implements Runnable { private Source source; public Comsumer(Source source) { this.source = source; } @Override public void run() { while (true) { synchronized (source) { if(source.flag) { source.flag = false; System.out.println("消费商品:"+source.count); source.notify(); // 唤醒另一线程 } else { try { source.wait(); // 等前线程等待 } catch (InterruptedException e) { e.printStackTrace(); } } } } } } public class MQTest { public static void main(String[] args) { Source source = new Source(); Producer producer = new Producer(source); Comsumer comsumer = new Comsumer(source); Thread t1 = new Thread(producer); Thread t2 = new Thread(comsumer); t1.start(); t2.start(); } }1.wait()来自Object类,sleep()来自Thread类
2.调用 sleep()方法,线程不会释放对象锁。而调用 wait() 方法线程会释放对象锁;
3.sleep()睡眠后不出让系统资源,wait()让其他线程可以占用 CPU;
4.sleep(millionseconds)需要指定一个睡眠时间,时间一到会自然唤醒。而wait()需要配合notify()或者notifyAll()使用
