java-多线程-waitnotify

8次阅读

共计 1680 个字符,预计需要花费 5 分钟才能阅读完成。

  1. 因为涉及到对象锁,Wait、Notify 一定要在 synchronized 里面进行使用。
  2. Wait 必须暂定当前正在执行的线程, 并释放资源锁, 让其他线程可以有机会运行
  3. notify/notifyall: 唤醒线程
  • 共享变量
public class ShareEntity {
    private String name;
    // 线程通讯标识
    private Boolean flag = false;

    public ShareEntity() {}

    public String getName() {return name;}

    public void setName(String name) {this.name = name;}

    public Boolean getFlag() {return flag;}

    public void setFlag(Boolean flag) {this.flag = flag;}
}
  • 线程 1(生产者)
public class CommunicationThread1 extends Thread{

    private ShareEntity shareEntity;
    public CommunicationThread1(ShareEntity shareEntity) {this.shareEntity = shareEntity;}

    @Override
    public void run() {
        int num = 0;
        while (true) {synchronized (shareEntity) {if (shareEntity.getFlag()) {
                    try {shareEntity.wait();
                    } catch (InterruptedException e) {e.printStackTrace();
                    }
                }

                if (num % 2 == 0)
                    shareEntity.setName("thread1-set-name-0");
                else
                    shareEntity.setName("thread1-set-name-1");
                num++;
                shareEntity.setFlag(true);
                shareEntity.notify();}
        }
    }
}
  • 线程 2(消费者)
public class CommunicationThread2 extends Thread{
    private ShareEntity shareEntity;
    public CommunicationThread2(ShareEntity shareEntity) {this.shareEntity = shareEntity;}

    @Override
    public void run() {while (true) {synchronized (shareEntity) {if (!shareEntity.getFlag()) {
                    try {shareEntity.wait();
                    } catch (InterruptedException e) {e.printStackTrace();
                    }
                }
                System.out.println(shareEntity.getName());
                shareEntity.setFlag(false);
                shareEntity.notify();}
        }
    }
}
  • 请求
@RequestMapping("test-communication")
    public void testCommunication() {ShareEntity shareEntity = new ShareEntity();
        CommunicationThread1 thread1 = new CommunicationThread1(shareEntity);
        CommunicationThread2 thread2 = new CommunicationThread2(shareEntity);
        thread1.start();
        thread2.start();}
  • 结果

thread1-set-name-0
thread1-set-name-1
thread1-set-name-0
thread1-set-name-1
thread1-set-name-0
thread1-set-name-1
thread1-set-name-0

正文完
 0