浅谈java多线程wait,notify

时间:2021-05-19

前言

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章