当前位置: 首页 > news >正文

多线程停止的方法

线程停止有基本的两种思路:

执行stop()函数,但是不够安全,这是一个强制结束线程的方式,

任务结束,自己停止。(常用方法)

1.标记停止的方法。

 

弊端:在多个线程的情况下,当有一个线程处于等待状态时,此时停止线程,则无法停止处于等待中的线程。

示例:设置标记flag,控制线程结束。

class StopThread implements Runnable{
private boolean flag = true;
public void run (){
while(flag){
System.out.println(Thread.currentThread().getName()+"run ");
}
}

public void setFlag(){
this.flag =false;;

}
}

class ProduceDemo{
public static void main(String[] arg){

StopThread stop = new StopThread();
Thread t1 = new Thread(stop);
Thread t2 = new Thread(stop);
t1.start();
t2.start();
int i = 0;
while(true){
if(i == 50){
stop.setFlag();
break;
}
System.out.println("main");
i++;
}
}
}

下面这种用标记法就不行,就算标记设置为了false,但是出于wait中的线程无法结束任务。

class StopThread implements Runnable{
private boolean flag = true;

public synchronized void run (){
while(flag){
try{
wait();
}
catch(Exception e){
System.out.println("Exception ");
};
System.out.println(Thread.currentThread().getName()+"********");
}

}
public void setFlag(){
this.flag =false;

}


}

class ProduceDemo{
public static void main(String[] arg){

StopThread stop = new StopThread();
Thread t1 = new Thread(stop);
Thread t2 = new Thread(stop);
t1.start();
t2.start();

int i = 0;
while(true){
if(i == 50000){
stop.setFlag();
break;
}

i++;
}
System.out.println("over");
}
}

2.interrupt方法

线程处于冻结状态无法获取标记,如何结束呢?

可以使用interrupt()方法将线程从冻结状态强制恢复到运行状态中来,让线程具备CPU的执行资格。

强制动作会发生interruptException,记得处理。

class StopThread implements Runnable{
private boolean flag = true;

public synchronized void run (){
while(flag){
try{
wait();
}
catch(Exception e){
System.out.println("Exception ");
flag = false;
};
System.out.println(Thread.currentThread().getName()+"********");
}

}
public void setFlag(){
this.flag =false;

}


}

class ProduceDemo{
public static void main(String[] arg){

StopThread stop = new StopThread();
Thread t1 = new Thread(stop);
Thread t2 = new Thread(stop);
t1.start();
t2.start();

int i = 0;
while(true){
if(i == 50000){
t1.interrupt();
t2.interrupt();
break;
}

i++;
}
System.out.println("over");
}
}

转载于:https://www.cnblogs.com/chzlh/p/9278611.html

相关文章:

  • Java 学习(18)--列表(List)/ 集合 (Set)/ 泛型 / Map
  • Koala – 开源的前端预处理器语言图形编译工具
  • 头晕的奶牛 C组模拟赛
  • 文件头修改工具
  • 网络编程知识整理
  • 在IDEA中,MAVEN项目依赖报错问题(dependencies中总是有红色波浪线)
  • React 16 Jest快照测试
  • 常用的商业级和免费开源Web漏洞扫描工具
  • 从零开始学习部署
  • python:unittest之跳过测试和预期失败的用例
  • [转载] 以下划线开头的变量
  • Hibernate SQL优化小技巧使用dynamic-insert=true insert=true
  • mui页面传值
  • js中for循环的研究
  • HDU 3709 Balanced Number(数位DP)题解
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 230. Kth Smallest Element in a BST
  • flask接收请求并推入栈
  • Java-详解HashMap
  • js 实现textarea输入字数提示
  • Laravel5.4 Queues队列学习
  • Node项目之评分系统(二)- 数据库设计
  • PHP 小技巧
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • 对象引论
  • 高程读书笔记 第六章 面向对象程序设计
  • 机器学习 vs. 深度学习
  • 面试遇到的一些题
  • 排序算法之--选择排序
  • 区块链共识机制优缺点对比都是什么
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • #微信小程序(布局、渲染层基础知识)
  • (¥1011)-(一千零一拾一元整)输出
  • (7)STL算法之交换赋值
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (理论篇)httpmoudle和httphandler一览
  • (原創) 物件導向與老子思想 (OO)
  • .net 7 上传文件踩坑
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • [] 与 [[]], -gt 与 > 的比较
  • [20160807][系统设计的三次迭代]
  • [4.9福建四校联考]
  • [Android Studio] 开发Java 程序
  • [Docker]三.Docker 部署nginx,以及映射端口,挂载数据卷
  • [flask]http请求//获取请求头信息+客户端信息
  • [GN] DP学习笔记板子
  • [Go WebSocket] 多房间的聊天室(三)自动清理无人房间