前言
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();}}}}请求
结果
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。