线程如何停止呢
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-将多线程停止的两种方法的更多相关文章

  1. WPF多线程UI更新——两种方法

    WPF多线程UI更新——两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...

  2. JAVA 集合 List 分组的两种方法

    CSDN日报20170219--<程序员的沟通之痛> [技术直播]揭开人工智能神秘的面纱 程序员1月书讯 云端应用征文大赛,秀绝招,赢无人机! JAVA 集合 List 分组的两种方法 2 ...

  3. java字符串大小写转换的两种方法

    转载自:飞扬青春sina blogjava字符串大小写转换的两种方法 import java.io..* public class convertToPrintString {          pu ...

  4. java连接Access数据库的两种方法

    where ziduan  in(select  ziduan from  table) 嵌套 ResultSet rs = pst.executeQuery();List list = new Ar ...

  5. Java获得键盘输入的两种方法

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  6. Java获取当前类名的两种方法

    适用于非静态方法:this.getClass().getName() 适用于静态方法:Thread.currentThread().getStackTrace()[1].getClassName() ...

  7. Java中HashMap遍历的两种方法(转)

    第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...

  8. Java导出Excel文件的两种方法

    将数据以Excel表格的形式导出:首先下载poi的jar包,导入项目中,或者使用maven仓库管理,在pom文件添加:<dependency>    <groupId>org. ...

  9. Java遍历文件夹的两种方法(非递归和递归)

    import java.io.File; import java.util.LinkedList; public class FileSystem {    public static int num ...

随机推荐

  1. explode和implode的运用

    $kesu_list=DD('Kesu.Kesu')->kesu_list(); foreach($kesu_list[0] as $key=>$val){ $reason_id_list ...

  2. empty 和isset的差别

    都可以判定一个变量是否为空:都返回boolean类型,即true或false.isset()用来检测变量是否设置,只能用于变量,因为传递任何其它参数都将造成解析错误.若想检测常量是否已设置,可使用 d ...

  3. 8.Smarty的条件判断语句的写法

    {if $newObj eq 'a'} welcome a {elseif $a eq 'b'} welcome b {else} welcome others {/if}

  4. 从栈不平衡问题 理解 calling convention

    最近在开发的过程中遇到了几个很诡异的问题,造成了栈不平衡从而导致程序崩溃. 经过几经排查发现是和调用规约(calling convention)相关的问题,特此分享出来. 首先,讲一下什么是调用规约. ...

  5. web前段学习2016.6.6

    目前上网的方式:手机平板电脑移动端:智能手机.平板PC:电脑.笔记本运行在移动端的东西:APPios:object-candroid:javapc端的东西:桌面应用程序 c++ 我们上网的方式都是通过 ...

  6. javaWeb第一天

    //第一个JavaWeb项目package com.chy.action; import java.io.IOException; import javax.servlet.ServletExcept ...

  7. *bzoj1083题解

    题目: 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道 ...

  8. js获取鼠标点击的对象,点击另一个按钮删除该对象

    作为js的一名新手,对于所谓的event的了解并不是太多,仅仅根据视频教学中的例子模仿着,写了诸如: function funcname(e) { e=window.event||event };的函 ...

  9. Linux查看内存占用情况

    输入:top PID 进程的ID USER 进程所有者 PR 进程的优先级别,越小越优先被执行 Ninice 值 VIRT 进程占用的虚拟内存 RES 进程占用的物理内存 SHR 进程使用的共享内存 ...

  10. 如何在web项目中添加javamelody monitoring 监控。

    1.在工程的maven pom中添加依赖javamelody-core <!-- monitoring监控 --><!-- https://mvnrepository.com/art ...