前言
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;}@Overridepublic 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");elseshareEntity.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;}@Overridepublic 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-0thread1-set-name-1thread1-set-name-0thread1-set-name-1thread1-set-name-0thread1-set-name-1thread1-set-name-0
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。
新闻热点
疑难解答