Java-将多线程停止的两种方法
线程如何停止呢
	stop方法过时了,看起描述发现,有其他解决方案。
	线程结束:就是让线程任务代码执行完,run方法结束。
	run方法怎么结束呢?
	run方法中通常都定义循环,只要控制住循环就哦了。
//演示停止线程。
class Demo implements Runnable {
private boolean flag = true;
public void run() {
while(flag) { System.out.println(Thread.currentThread().getName()+"----->");
}
}
//对标记的修改方法。
public void changeFlag() {
flag = false;
}
} class MStopThreadDemo {
public static void main(String[] args) {
Demo d = new Demo(); Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
t2.start(); int x = 0;
while(true) {
if(++x == 50) {
d.changeFlag();//改变线程任务代码的标记,让其他线程也结束。
break;//跳出循环,主线程可以结束。
}
System.out.println("main-------->"+x);
} System.out.println("over");
}
}
注意:万一线程在任务中处于了冻结状态,那么它还能去判断标记吗?不能!
怎么办?通过查阅stop方法的描述,发现提供了一个解决方法:
	如果目标线程等待很长时间,则应使用 interrupt 方法来中断该等待
	所谓的中断并不是停止线程。
	interrupt的功能是 将线程的冻结状态清除,让线程恢复到的运行状态(让线程重新具备cpu的执行资格)。
	因为是强制性的所以会有异常InterruptedException发生,可以在catch中捕获异常,
	在异常处理中,改变标记让循环结束,让run方法结束。
//演示停止线程。
class Demo implements Runnable {
private boolean flag = true;
public synchronized void run() {//不要这么做将synchronized加到run方法这已经变成了单线程了这里是故意这么做为了测试因为wait()必须要有所属的锁 while(flag) {
try {
wait();//t1 t2 //如果使用notify()必须和wait()在同一个锁里,那如果不在同一个锁怎么办只能用interrupt()
}
catch (InterruptedException e) {
System.out.println(Thread.currentThread().toString()+"....."+e.toString());
changeFlag(); // 由于interrupt()方法是强制性让线程恢复到运行状态,既然是强制的就会抛出异常所以在异常捕获时将他标记进行修改
} System.out.println(Thread.currentThread().getName()+"----->");
}
}
//对标记的修改方法。
public void changeFlag() {
flag = false;
}
} class MStopThreadDemo2 {
public static void main(String[] args) {
Demo d = new Demo(); Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
t2.start(); int x = 0;
while(true){
if(++x == 50){
//d.changeFlag();//改变线程任务代码的标记,让其他线程也结束。
//对t1线程对象进行中断状态的清除,强制让其恢复到运行状态。
t1.interrupt();
//对t2线程对象进行中断状态的清除,强制让其恢复到运行状态。
t2.interrupt(); break;//跳出循环,主线程可以结束。
}
System.out.println("main-------->"+x);
} System.out.println("over");
}
}
Java-将多线程停止的两种方法的更多相关文章
- WPF多线程UI更新——两种方法
		
WPF多线程UI更新——两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...
 - JAVA 集合 List 分组的两种方法
		
CSDN日报20170219--<程序员的沟通之痛> [技术直播]揭开人工智能神秘的面纱 程序员1月书讯 云端应用征文大赛,秀绝招,赢无人机! JAVA 集合 List 分组的两种方法 2 ...
 - java字符串大小写转换的两种方法
		
转载自:飞扬青春sina blogjava字符串大小写转换的两种方法 import java.io..* public class convertToPrintString { pu ...
 - java连接Access数据库的两种方法
		
where ziduan in(select ziduan from table) 嵌套 ResultSet rs = pst.executeQuery();List list = new Ar ...
 - Java获得键盘输入的两种方法
		
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...
 - Java获取当前类名的两种方法
		
适用于非静态方法:this.getClass().getName() 适用于静态方法:Thread.currentThread().getStackTrace()[1].getClassName() ...
 - Java中HashMap遍历的两种方法(转)
		
第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...
 - Java导出Excel文件的两种方法
		
将数据以Excel表格的形式导出:首先下载poi的jar包,导入项目中,或者使用maven仓库管理,在pom文件添加:<dependency> <groupId>org. ...
 - Java遍历文件夹的两种方法(非递归和递归)
		
import java.io.File; import java.util.LinkedList; public class FileSystem { public static int num ...
 
随机推荐
- php后台拼接输出table表格
			
<?php header("Content-type:text/html;charset=utf-8"); $str=''; $str.='<table border= ...
 - 简单svg动画实现
			
一.将svg嵌入到html中 svg是指可伸缩矢量图形,它使用XML格式定义图像.在html中可以使用<svg>标签直接嵌入svg代码,例如: <svg version=" ...
 - java-bootstrap
			
先来看一段每一个项目都要写的BASH脚本. #!/usr/bin/env bash in start ) ;; stop ) ;; restart ) shift "$0" sto ...
 - 网络配置之nmcli
			
使用nmcli命令配置网络 NetworkManager是管理和监控网络设置的守护进程,设备既就是网络接口,连接是对网络接口的配置,一个网络接口可以有多个连接配置,但同时只有一个连接配置生效. 1 配 ...
 - HttpServletResponse addHeader() 与 setHeader() 区别
			
对于addHeader() 和 setHeader()这两个方法,可能我们在需要的时候,用起来感觉都一样,都能达到想要的效果.但是这两个方法本质上是不一样的. setHeader(name, val ...
 - 详解Android Activity---启动模式
			
相关的基本概念: 1.任务栈(Task) 若干个Activity的集合的栈表示一个Task. 栈不仅仅只包含自身程序的Activity,它也可以跨应用包含其他应用的Activity,这样有利于 ...
 - 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
			
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
 - Linux 学习记录 四(Bash 和 Shell scirpt)
			
一.什么是 Shell? 狭义的shell指的是指令列方面的软件,包括基本的Linux操作窗口Bash等,广义的shell则包括 图形接口的软件,因为图形接口其实也可以操作各种驱动程序来呼叫核心进行工 ...
 - Spark的误解-不仅spark是内存计算,hadoop也是内存计算
			
市面上有一些初学者的误解,他们拿spark和hadoop比较时就会说,Spark是内存计算,内存计算是spark的特性.请问在计算机领域,mysql,redis,ssh框架等等他们不是内存计算吗?依据 ...
 - SSH连不上虚拟机的问题解决
			
这几天工作任务不重,今早上班打算在liunx下运行下python脚本.打开VM,SSH突然连不上虚拟机了.网上试了很多方法都不行,最后花费2个小时解决了这一问题. 结合我的实际情况,问题解决如下: 1 ...