java中wait()和notify()使用

    科技2025-11-17  6

    java中的守护块

    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(); } }

    wait()和sleep()区别

    1.wait()来自Object类,sleep()来自Thread类

    2.调用 sleep()方法,线程不会释放对象锁。而调用 wait() 方法线程会释放对象锁;

    3.sleep()睡眠后不出让系统资源,wait()让其他线程可以占用 CPU;

    4.sleep(millionseconds)需要指定一个睡眠时间,时间一到会自然唤醒。而wait()需要配合notify()或者notifyAll()使用

    Processed: 0.013, SQL: 8