摘要:因为涉及到对象锁,一定要在里面进行使用。必须暂定当前正在执行的线程并释放资源锁让其他线程可以有机会运行唤醒线程共享变量线程通讯标识线程生产者线程消费者请求结果
因为涉及到对象锁,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
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/74700.html
摘要:运行可运行状态的线程获得了时间片,执行程序代码。阻塞的情况分三种一等待阻塞运行的线程执行方法,会把该线程放入等待队列中。死亡线程方法执行结束,或者因异常退出了方法,则该线程结束生命周期。死亡的线程不可再次复生。 系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键...
摘要:和简介和均为的方法暂停一个线程唤醒一个线程从以上的定义中,我们可以了解到以下事实想要使用这两个方法,我们需要先有一个对象。在中任何一个时刻,对象的控制权只能被一个线程拥有。若有多个线程处于此控制权下的状态,只有一个会被唤醒。 最近看帖子,发现一道面试题: 启动两个线程, 一个输出 1,3,5,7…99, 另一个输出 2,4,6,8…100 最后 STDOUT 中按序输出 1,2,3,4...
摘要:一线程的基本概念单线程简单的说,单线程就是进程中只有一个线程。多线程由一个以上线程组成的程序称为多线程程序。当线程调用完方法进入后会自动释放锁,线程获得锁。 一、线程的基本概念 1.1 单线程 简单的说,单线程就是进程中只有一个线程。单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。 Java示例: public class SingleThrea...
摘要:本文对多线程基础知识进行梳理,主要包括多线程的基本使用,对象及变量的并发访问,线程间通信,的使用,定时器,单例模式,以及线程状态与线程组。源码采用构建,多线程这部分源码位于模块中。通知可能等待该对象的对象锁的其他线程。 本文对多线程基础知识进行梳理,主要包括多线程的基本使用,对象及变量的并发访问,线程间通信,lock的使用,定时器,单例模式,以及线程状态与线程组。 写在前面 花了一周时...
摘要:在从返回前,线程与其他线程竞争重新获得锁。就绪队列存储了将要获得锁的线程,阻塞队列存储了被阻塞的线程。当线程呈状态,调用线程对象的方法会出现异常。在执行同步代码块过程中,遇到异常而导致线程终止,锁也会被释放。 方法wait()的作用是使当前执行代码的线程进行等待,wait()方法是Object类的方法,该方法用来将当前线程置入预执行队列中,并且在wait()所在的代码行处停止执行,直...
摘要:已经在上面有提到过,和的作用是唤醒正在的线程,是随机唤醒线程中的一个,则是唤醒全部。释放和不释放锁在多线程的操作中,锁的释放与否是必须要清楚的,是会释放锁,而则不会。 wait wait方法是Object中的方法,这个方法的功能特性:1).执行wait方法的前提是当前线程已经获取到对象的锁,也就是wait方法必须在synchronized修饰的代码块或者方法中使用。2).执行wait之...
阅读 2712·2021-11-22 13:54
阅读 2653·2021-10-14 09:42
阅读 3922·2021-09-28 09:47
阅读 2130·2021-09-03 10:28
阅读 1175·2021-07-26 23:38
阅读 2515·2019-08-30 15:54
阅读 2604·2019-08-29 16:35
阅读 1346·2019-08-29 15:42