停止线程

如何停止线程呢?须知stop()已经过时,那就只有一种方案了,即run()结束。其原理是线程任务通常都有循环,因为开启线程就是为了执行需要一些时间的代码。只要控制住循环,就可以结束run方法,就可以停止线程了。那如何控制循环呢?很简单啦,只须弄个标记(定义变量)即可。

class StopThread implements Runnable
{private boolean flag = true;public void run(){while (flag){System.out.println(Thread.currentThread().getName() + "....run");}}public void changeFlag(){flag = false;}
}class MyStopThreadDemo
{public static void main(String[] args) {StopThread st = new StopThread();Thread t1 = new Thread(st);Thread t2 = new Thread(st);t1.start();t2.start();for (int x = 1; x <= 50; x++){if (x == 40){st.changeFlag();}System.out.println("main...." + x);}System.out.println("over");}
}

此时,会有一种特殊情况——当线程处于了冻结状态时,就不会读取到标记了,那么线程显然就不会结束。即:

class StopThread implements Runnable
{private boolean flag = true;public synchronized void run(){while (flag){try{wait();//t0、t1}catch (InterruptedException e){System.out.println(Thread.currentThread().getName() + "............" + e.toString());}System.out.println(Thread.currentThread().getName() + "....run");}}public void changeFlag(){flag = false;}
}class MyStopThreadDemo
{public static void main(String[] args) {StopThread st = new StopThread();Thread t1 = new Thread(st);Thread t2 = new Thread(st);t1.start();t2.start();for (int x = 1; x <= 50; x++){if (x == 40){st.changeFlag();}System.out.println("main...." + x);}System.out.println("over");}
}

当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除,强制让线程恢复到运行状态中来,这样就可以操作标记让线程结束。Thread类中提供了该方法——interrupt()。如此,可将以上程序修改为:

class StopThread implements Runnable
{private boolean flag = true;public synchronized void run(){while (flag){try{wait();//t0、t1}catch (InterruptedException e){System.out.println(Thread.currentThread().getName() + "............" + e.toString());flag = false;//自杀,return;是他杀}System.out.println(Thread.currentThread().getName() + "....run");}}public void changeFlag(){flag = false;}
}class MyStopThreadDemo
{public static void main(String[] args) {StopThread st = new StopThread();Thread t1 = new Thread(st);Thread t2 = new Thread(st);t1.start();t2.start();for (int x = 1; x <= 50; x++){if (x == 40){//st.changeFlag();t1.interrupt();//将t1线程中断。t2.interrupt();//将t2线程中断。}System.out.println("main...." + x);}System.out.println("over");}
}

小结

InterruptedException(中断异常)什么时候会发生呢?凡是线程处于冻结状态,如果强制把它恢复回来,那么必须发生的异常。能让线程处于冻结状态的方法不多,第一个就是sleep(),第二个就是wait()。

第二十四讲 多线程——如何停止线程?相关推荐

  1. tapestry mysql_第二十四讲:tapestry的grid组件

    2019独角兽企业重金招聘Python工程师标准>>> tapestry的grid组件,具体实现方法看源码吧,之前的教程也有讲到,这次配合数据库操作使用,实体Person.java在 ...

  2. 深聊全链路压测之:第二十四讲 | 分布式调度平台的选型与落地。

    落地分布式调度平台 1.引言 2.平台选型 2.1 中间件对比与筛选 2.2 XXL-JOB介绍 3.平台落地思路与实践 3.1 落地思路 3.2 落地实践 3.2.1 搭建XXL-JOB 3.2.2 ...

  3. PreScan快速入门到精通第二十四讲3D车辆动力学模型

    三维车辆动力学模型可以引导PreScan汽车在三维道路上行驶.该模型具有与二维简单动力学模型相同的组件,但底盘部分(车辆动力学)已被修改.其他部分保持不变.在三维车辆动力学仿真过程中,可能会有一些轻微 ...

  4. 小甲鱼Python第二十三讲、第二十四讲(递归-这帮小兔崽子、汉诺塔)

    def fab(n):迭代的方法if n<1:return -1while(n-2)>0:n3=n2+n1n1=n2n2=n3n=n-1return n3 def rabbit(n):递归 ...

  5. 第二十四讲项目3-一元二次方程全解

    程序代码 #include <stdio.h> #include <math.h> /* *csdn学院--2016级 *文件名称:Myfun26.c *作者:小臣小仁 *完成 ...

  6. 第二十四讲编程项目 求函数的值 油量监控 一元二次方程全解等

    任务和代码: [项目1:分段函数求值] 从键盘输入x的值(要求为实型),根据公式1计算并输出x和y的值. /* *Copyright (c) 2016, CSDN学院 *All rights rese ...

  7. 视觉SLAM十四讲第二章学习与课后题与随笔日记

    视觉SLAM十四讲第二章 主要内容是linux下c++编程,cpp,lib,smakelist这类文件关联与使用. 前面出现过的问题: P31-P32 make: *** 没有指明目标并且找不到 ma ...

  8. 视觉SLAM十四讲(高翔第二版)

    视觉SLAM十四讲高翔第二版调试记录 前言 一.3.7可视化演示程序运行全过程Pangolin plotTrajectory.cpp 1. **在3rdparty中下载Pangolin** 2. ** ...

  9. 视觉SLAM十四讲学习笔记-第二讲-开发环境搭建

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 ​​​​​​​ lin ...

最新文章

  1. PyTorch | (3)Tensor及其基本操作
  2. ug10许可证错误一8_落实管理要求 做好证后监管——江西省南昌市开展排污许可证后监管探索与实践...
  3. 嵌入式linux 添加中断,《嵌入式linux应用程序开发完全手册》中断控制器操作(外部中断)学习笔记...
  4. 苹果企业证书_企业签名App稳定吗?
  5. 如何利用DataWorks OpenAPI实现圈人?
  6. Uber和Non-Uber模式介绍
  7. SplitContainer.SplitterDistance属性值设置应注意的与FixedPanel有关
  8. 线JSON转jsdoc工具
  9. 在电脑上安装python-在电脑上安装python的方法
  10. 【转】Latex入门教程
  11. win10如何添加linux开机引导,win10 linux 双系统怎么设置开机引导
  12. 计算机网络自顶向下方法 第三章 作业习题答案
  13. 双极性(相)四线步进电机TC1508S(双通道直流马达驱动器)
  14. mysql 中间件 atlas_MySQL中间件-Atlas
  15. Linux常用命令之文件搜索命令
  16. 上海大学计算机学院2021,2020-2021学年秋季学期新生选课通知
  17. psv摇杆测试软件,adrenaline专用右摇杆控制视角插件发布, 转
  18. Elastic Stack技术栈实践与Filebeat+Kibana企业级案例实战
  19. 计算机系统概述 —— 硬件系统
  20. Verilog 相等运算符之相等和全等

热门文章

  1. Mac 地址与 IP 地址有什么区别?
  2. JPEG图像编码解码
  3. Three.js使用ammo.js实现投篮游戏
  4. 布尔的符号元素和符号法则  布尔逻辑之三
  5. 鸿蒙系统手机一览表,华为鸿蒙os系统支持的手机型号有哪些?鸿蒙os适配机型列表一览[多图]...
  6. java界面化_JAVA 界面美化
  7. java读取excel总是有小数点的解决方案
  8. Rexxar 是一个针对移动端的混合开发框架。
  9. fastboot 新手刷机傻瓜教程
  10. emqx开启自定义权限认证