zoukankan      html  css  js  c++  java
  • 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"); } }
  • 相关阅读:
    分子动力学中步长的选取
    提高编程能力刷题网站
    【18】如何把数据存储到MongoDB数据库
    【17】有关python面向对象编程的提高【多继承、多态、类属性、动态添加与限制添加属性与方法、@property】
    【16】有关python面向对象编程
    【15】杂记章节
    【14】文件读取并格式化处理
    【13】python time时间模块知识点备查
    【11】python 递归,深度优先搜索与广度优先搜索算法模拟实现
    6380. 【NOIP2019模拟2019.10.06】小w与最长路(path)
  • 原文地址:https://www.cnblogs.com/wgDream/p/7347841.html
Copyright © 2011-2022 走看看