共计 1680 个字符,预计需要花费 5 分钟才能阅读完成。
- 因为涉及到对象锁,Wait、Notify 一定要在 synchronized 里面进行使用。
- Wait 必须暂定当前正在执行的线程, 并释放资源锁, 让其他线程可以有机会运行
- 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
正文完