java初入多线程5
java初入多线程5
线程中断
- 概念 :让目标线程停止执行,但是是高知目标线程希望线退出,具体退出由目标线程自己决定。
- 相关的方法,暂时只介绍Thread的方法
- Thread.interrupt() //中断线程 也是告知目标线程中断,也就是设置中断标志位
- Thread.isInterrupted() //判断是否被中断--通过上面方法设置的中断标志位来判断是否被中断
- Thread.interrupted //判断是否被中断,并清楚中断状态,,, 用来判断当前线程的中断状态,同事清除中断标志位状态
- 程序实现
public static void main(String[] args) throws InterruptedException {Thread t1=new Thread(){@Overridepublic void run() {while(true){//在这里判断 是否有中断位 ,又中断位了就将线程终止if(Thread.currentThread().isInterrupted()){System.out.println("中断了");break;}Thread.yield();}}};t1.start();Thread.sleep(2000);t1.interrupt(); // 在这里进行通知中断}
通知(notity)与等待(wait)
- 当一个线程执行wait方法的时候,那么当前线程就会停止继续执行,转为等待的状态,然后等其他线程执行notity 方法为止。执行如图所示,如果用notity是随机唤醒一个线程不是按照执行顺序唤醒线程
notity唤醒等待的线程
wait和notity的工作流程
wait 执行后会释放对应的监视器,其他线程会获得该监视器,然后执行notity 之后 会释放监视器,wait 重新获得监视器,继续执行程序。
public class SimpleWN {final static Object object =new Object();public static class T1 extends Thread{@Overridepublic void run() {synchronized(object) {System.out.println(System.currentTimeMillis()+ "T1 start!");try {System.out.println(System.currentTimeMillis() + "T1 wait for object");object.wait(); //wait等待 然后等到notity来唤醒 ,但是notity唤醒也是随机的 并且wait 方法会释放目标对象的锁而下面的sleep方法就不会释放} catch (Exception e) {e.printStackTrace();}System.out.println(System.currentTimeMillis() + ": T1 end!");}}}public static class T2 extends Thread{@Overridepublic void run() {synchronized (object) {System.out.println(System.currentTimeMillis()+"T2 start ! notity one thread");object.notify();System.out.println(System.currentTimeMillis()+"T2 end!");try {Thread.sleep(2000); //睡眠2秒} catch (Exception e) {// TODO: handle exception}}}}public static void main(String[] args) {Thread thread1=new T1();Thread thread2=new T2();thread1.start();thread2.start();}}
挂起(suspend)和继续执行(resume)
- 被废弃的方法,说明下原理:suspend 在导致线程暂停的通识不把锁的资源释放,其他线程 如果访问没有被释放的锁,那么也会受到牵连导致无法 继续执行。除非在该暂停的线程上进行了resume操作那么该线程才会继续执行,阻塞的其他线程也会继续执行。如果resume 操作在suspend前执行了那么被执行suspend的线程很难有机会再被继续执行。这种情况下很可能出现死锁的情况
死锁
等待线程结束(join)和谦让(yield)
- 我们在程序的执行中,很可能会出现多个线程之间有依赖关系的线程,只有当前一个线程执行完毕后才能继续执行以后的线程,那么我们可以使用join方法来实现 ,等待线程结束。看如下代码
public class JoinMain {/*** volatile 变量的可见性 不可代替锁*/private volatile static int i=0;public static class AddThread extends Thread{@Overridepublic void run() {for(i=0;i<10000000;i++);}}public static void main(String[] args) throws Exception {AddThread thread= new AddThread();thread.start();thread.join(); //等待的意思 本质是让调用线程wait 在当前线程实例上 调用的是wait(0) 这个方法System.out.println(i);}}
代码执行结果如图
运行结果
注释掉join
从上面两个图可以看出来 如果不适用join 那么执行的结果会很小。执行join方法后会让该线程等待addThread线程执行完毕。
- yield方法:谦让,谦让,意思 当该方法执行后会让当前线程把cpu 让出来,到那时有一点需要注意的是让出cpu后该线程还会参与到cpu的争夺中,会不会分配到 这就不一定了。
java初入多线程5相关推荐
- java初入多线程6
java初入多线程6 volatile 与java内存模型(JMM) java的内存模型都是围绕着原子性.有序性.还有可见性来展开的. volatile 主要是用来告知虚拟机,被volatile 修饰 ...
- java初入职场在工作中注意
java小白在工作中注意 解决问题能力 解决问题能力往往是最重要的,能否解决问题往往决定你是否能在公司待下去,下面介绍一下面对问题如何解决 注意细节 遇到错误不要惊慌,手足无措,不知道从什么地方开始解 ...
- java 多线程初入2
java 多线程初入2 并行的两个定律 获得更好的性能. 一般我们会把串行的程序改成并行的 期望提高的程序执行效率 问题. 业务的需要. 两个定律分别为 Amdahl 和 Gustafson Amda ...
- Java学习—初入Java
一.初入Java 文章目录 一.初入Java 2.JDK的目录介绍 3.PATH环境变量 4.ClassPath环境变量 5.编写第一个Java程序 6.Java的运行机制 7.Java包的定义与使用 ...
- 初入Java测试员之路
初入(在大神的指导下)小小的经验之谈: 1.要熟悉需求分析说明书!重点要熟悉业务脉络,清晰业务流程传递! 2.熟悉项目原型!原型界面需求要保证能在项目真正实现中看到! 3.亲自操作真实项目实现,要切换 ...
- 初入Ubuntu的Java开发者安装软件手记
转载 [Linux]初入Ubuntu的Java开发者安装软件手记 作者:Rambo Chen 分类专栏: Java 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...
- 【数据结构】初入数据结构的树(Tree)以及Java代码实现(一)
初入数据结构的树(Tree)以及Java代码实现(一) 树的定义 为什么叫树? 树型结构的元素具有一对多关系 树的定义 树的一些基本概念 树的结点 后代,祖先 子树.空树 树的度与高(深度),结点的度 ...
- 个人java学习路线-html初入
个人java学习路线-html初入 简单介绍 第一个html html基本标签 html实体符号 html的表格 创建表格和表格简单格式 表格合并 html的表格-thead tbody tfoot ...
- java 高效的多线程同步_java多线程的同步和异步
java多线程的同步和异步 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算 ...
最新文章
- 演讲十忌(翻译并制作成PPT)
- 用html写消费记录页面,支付流水记录.html
- SpringCloud中Feign服务调用请求方式及参数总结
- 高小明的云平台搭建系列之一——物理机装 ESXi 5.0
- 浅谈redis数据库的键值设计
- BOM—浏览器对象模型(Browser Object Model)
- opencv4.5.0安装包_VB6.0软件安装包以及安装教程
- python pep8
- DNS中的七大资源记录介绍
- 把字符串变为变量_python学习第10课--列表和字符串的可变性
- 『软件工程10』结构化系统分析:数据流图和字典案例分析
- [Python]网络爬虫学习笔记,爬取豆瓣妹子上妹子的照片
- 分布式消我爬取豆瓣10万短评,告诉你《复仇者联盟4》在讲什么?
- 消防信号总线原理_消防联动工作原理
- Python_pgzero小球抛物线运动
- Codeforces Round #670 (Div. 2) D. Three Sequences(差分序列、数学思维分析)
- 喇叭、扬声器的正负极问题
- 超声波风速风向传感器
- golang的基本语法
- Fatfs配置与编译
热门文章
- 5009. tinyfsm有限状态机
- 数据结构之顺序表和有序表查找其实现
- Modbus调试软件--ModbusPoll、ModbusSlave使用详解
- [读书笔记] - 《深度探索C++对象模型》第5章 构造、解构、拷贝语意学
- SVD 与 PCA 的直观解释(3): SVD的直观解释及推导
- mysql 安全问题_浅谈MySQL数据库的Web安全问题
- android camera 动画,Android 使用Camera创建3D动画
- Redis模式对比:主从模式 VS 哨兵sentinel模式 VS Redis cluster模式
- 集合各实现类的底层实现原理
- 2017-2018-1 20155209 《信息安全系统设计基础》第一周学习总结