java初入多线程5

线程中断

  1. 概念 :让目标线程停止执行,但是是高知目标线程希望线退出,具体退出由目标线程自己决定。
  2. 相关的方法,暂时只介绍Thread的方法
  • Thread.interrupt() //中断线程 也是告知目标线程中断,也就是设置中断标志位
  • Thread.isInterrupted() //判断是否被中断--通过上面方法设置的中断标志位来判断是否被中断
  • Thread.interrupted //判断是否被中断,并清楚中断状态,,, 用来判断当前线程的中断状态,同事清除中断标志位状态
  1. 程序实现
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)

  1. 当一个线程执行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)

  1. 被废弃的方法,说明下原理:suspend 在导致线程暂停的通识不把锁的资源释放,其他线程 如果访问没有被释放的锁,那么也会受到牵连导致无法 继续执行。除非在该暂停的线程上进行了resume操作那么该线程才会继续执行,阻塞的其他线程也会继续执行。如果resume 操作在suspend前执行了那么被执行suspend的线程很难有机会再被继续执行。这种情况下很可能出现死锁的情况

死锁

等待线程结束(join)和谦让(yield)

  1. 我们在程序的执行中,很可能会出现多个线程之间有依赖关系的线程,只有当前一个线程执行完毕后才能继续执行以后的线程,那么我们可以使用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线程执行完毕。

  1. yield方法:谦让,谦让,意思 当该方法执行后会让当前线程把cpu 让出来,到那时有一点需要注意的是让出cpu后该线程还会参与到cpu的争夺中,会不会分配到 这就不一定了。

java初入多线程5相关推荐

  1. java初入多线程6

    java初入多线程6 volatile 与java内存模型(JMM) java的内存模型都是围绕着原子性.有序性.还有可见性来展开的. volatile 主要是用来告知虚拟机,被volatile 修饰 ...

  2. java初入职场在工作中注意

    java小白在工作中注意 解决问题能力 解决问题能力往往是最重要的,能否解决问题往往决定你是否能在公司待下去,下面介绍一下面对问题如何解决 注意细节 遇到错误不要惊慌,手足无措,不知道从什么地方开始解 ...

  3. java 多线程初入2

    java 多线程初入2 并行的两个定律 获得更好的性能. 一般我们会把串行的程序改成并行的 期望提高的程序执行效率 问题. 业务的需要. 两个定律分别为 Amdahl 和 Gustafson Amda ...

  4. Java学习—初入Java

    一.初入Java 文章目录 一.初入Java 2.JDK的目录介绍 3.PATH环境变量 4.ClassPath环境变量 5.编写第一个Java程序 6.Java的运行机制 7.Java包的定义与使用 ...

  5. 初入Java测试员之路

    初入(在大神的指导下)小小的经验之谈: 1.要熟悉需求分析说明书!重点要熟悉业务脉络,清晰业务流程传递! 2.熟悉项目原型!原型界面需求要保证能在项目真正实现中看到! 3.亲自操作真实项目实现,要切换 ...

  6. 初入Ubuntu的Java开发者安装软件手记

    转载 [Linux]初入Ubuntu的Java开发者安装软件手记 作者:Rambo Chen 分类专栏: Java 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  7. 【数据结构】初入数据结构的树(Tree)以及Java代码实现(一)

    初入数据结构的树(Tree)以及Java代码实现(一) 树的定义 为什么叫树? 树型结构的元素具有一对多关系 树的定义 树的一些基本概念 树的结点 后代,祖先 子树.空树 树的度与高(深度),结点的度 ...

  8. 个人java学习路线-html初入

    个人java学习路线-html初入 简单介绍 第一个html html基本标签 html实体符号 html的表格 创建表格和表格简单格式 表格合并 html的表格-thead tbody tfoot ...

  9. java 高效的多线程同步_java多线程的同步和异步

    java多线程的同步和异步 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算 ...

最新文章

  1. 演讲十忌(翻译并制作成PPT)
  2. 用html写消费记录页面,支付流水记录.html
  3. SpringCloud中Feign服务调用请求方式及参数总结
  4. 高小明的云平台搭建系列之一——物理机装 ESXi 5.0
  5. 浅谈redis数据库的键值设计
  6. BOM—浏览器对象模型(Browser Object Model)
  7. opencv4.5.0安装包_VB6.0软件安装包以及安装教程
  8. python pep8
  9. DNS中的七大资源记录介绍
  10. 把字符串变为变量_python学习第10课--列表和字符串的可变性
  11. 『软件工程10』结构化系统分析:数据流图和字典案例分析
  12. [Python]网络爬虫学习笔记,爬取豆瓣妹子上妹子的照片
  13. 分布式消我爬取豆瓣10万短评,告诉你《复仇者联盟4》在讲什么?
  14. 消防信号总线原理_消防联动工作原理
  15. Python_pgzero小球抛物线运动
  16. Codeforces Round #670 (Div. 2) D. Three Sequences(差分序列、数学思维分析)
  17. 喇叭、扬声器的正负极问题
  18. 超声波风速风向传感器
  19. golang的基本语法
  20. Fatfs配置与编译

热门文章

  1. 5009. tinyfsm有限状态机
  2. 数据结构之顺序表和有序表查找其实现
  3. Modbus调试软件--ModbusPoll、ModbusSlave使用详解
  4. [读书笔记] - 《深度探索C++对象模型》第5章 构造、解构、拷贝语意学
  5. SVD 与 PCA 的直观解释(3): SVD的直观解释及推导
  6. mysql 安全问题_浅谈MySQL数据库的Web安全问题
  7. android camera 动画,Android 使用Camera创建3D动画
  8. Redis模式对比:主从模式 VS 哨兵sentinel模式 VS Redis cluster模式
  9. 集合各实现类的底层实现原理
  10. 2017-2018-1 20155209 《信息安全系统设计基础》第一周学习总结