线程如何停止呢
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. linux 小技巧(磁盘空间搜索)

    这里记录一些linux 管理中可能会用到的又容易忘的一些小技巧. linux磁盘写入失败,提示磁盘空间不足.一般都会用df -h 或者df -i看是不是磁盘空间不足或者是inode空间不足.发生这种情 ...

  2. eclipse从SVN检出项目之后,项目出错

    今天公司把我分配到另一个项目组工作,然后下午使用SVN检出项目,出了问题 1.从SVN检出项目之后,要导入jar包.结果右键项目找不到Build Path,问了大牛才知道是这里的问题,一共四个步骤解决 ...

  3. 基于GCC的openMP学习与测试(2)

    一.openMP简单测试 1.简单测试(1) #include<omp.h> #include<time.h> #include<iostream> using n ...

  4. Linux 重启和关机命令

    shutdown -r  05:30   在凌晨五点30分关机     shutdown -r  05:30 &     后台执行     shutdown -c    取消前一个关机命令   ...

  5. Android源码博文集锦1

    Android精选源码 功能齐全的实用Android视频播放器 实现滑动到底部,加载更多RecyclerViewDemo 使用Kotlin语言编写Android MVP案例KotlinMVPDemo ...

  6. Gist - Fetch Usage

    Introduction Do you prefer the usage of "ES6 Promise"? If you do, you will like the usage ...

  7. Linux - iostat命令详解

    简介 iostat可以提供更丰富的IO性能状态数据,iostat命令有两个用途: 输出CPU的统计信息 输出设备和分区的I/O统计信息 命令语法及参数说明 语法: iostat [ -c | -d ] ...

  8. Spark Standalone Mode Configuration

    For currently popular distributed framework Spark, here is the intro and step to configure the spark ...

  9. Unity3D-游戏中的技能碰撞检测

    在游戏战斗中,我们会用到各种各样的碰撞检测,来判断是否打中了目标 比如扇形检测/圆形检测 还有矩形检测,王者荣耀里后羿的大招就是一个很长的矩形碰撞体 这些在Unity3D引擎中其实都封装好了一些Col ...

  10. 浅谈viewport

    我们通常在写移动端页面时,往往都会在html页面中加入这样一段话 <meta name="viewport" content="width=device-width ...