美文网首页
停止线程(stop方法已经过时了)

停止线程(stop方法已经过时了)

作者: 东风谷123Liter | 来源:发表于2018-07-12 10:24 被阅读0次
    • 为什么stop被放弃了:因为stop里面有一些bug!!

      • image.png
    • 如何停止线程?

      • 只有一种Run方法结束。(使用interrupt(中断)方法!该方法时结束线程的冻结状态,使线程回到运行状态来。)

      • 开启线程运行,运行代码通常是循环结构。

      • 只要控制好线程就能让Run方法结束。

    • 一般情况:

    class StopThread implements Runnable{
        private boolean flag = true;
        public void run(){
            while(flag){
                System.out.println(Thread.currentThread().getName()+".....run");
            }
        }
        public void changeFlag(){    //改变锁中线程的标志位,以达到终止线程的作用。
            flag = false;
        }
    }
    class StopDemo{
        public static void main(String[] args){
            StopThread st = new StopThread();
    
            Thread t1 = new Thread(st);
            Thread t2 = new Thread(st);
    
            t1.start();
            t2.start();
    
            int num = 0;
            while(true){
                num++;
                if(num == 10){
                    st.changeFlag();    //中断线程!
                    break;                //退出程序!
                }
                System.out.println(Thread.currentThread().getName()+".............."+num);    //显示主线程的运行状况。
            }
        }
    }
    
    • 运行结果:

      • image.png
    • 特殊情况:

      • 当线程处于了冻结状态,就不会读取标记,那么线程就不会结束。
    • 当没有指定方式让冻结线程恢复到运行状态时,这时想要对线程进行冻结线程进行清除。

      • 强制让冻结线程恢复到运行状态中来,这样就可以让线程操作标记让线程结束。
    • 代码:

    //特殊情况!!!同步!当线程处于了冻结状态,就不会读区标记,就不会结束线程
    //解决办法:InterruptedException,如果用循环停止线程,wait(),sleep()就是异常!
    class StopThread implements Runnable{
        private boolean flag = true;
        public synchronized void run(){
            while(flag){
                try{
                    wait();
                }
                catch(InterruptedException e){  //将冻结状态的线程强制恢复到运行状态。
                    System.out.println(Thread.currentThread().getName()+".....Exception");
                    flag = false;
                }
                System.out.println(Thread.currentThread().getName()+".....run");
            }
        }
        public void changeFlag(){
            flag = false;
        }
    }
    class StopDemo{
        public static void main(String[] args){
            StopThread st = new StopThread();
    
            Thread t1 = new Thread(st);
            Thread t2 = new Thread(st);
    
            t1.start();
            t2.start();
    
            int num = 0;
            while(true){
                num++;
                if(num == 100){
                    //st.changeFlag();
                    t1.interrupt(); //中断线程t1,
                    t2.interrupt();
                    break;
                }
                System.out.println(Thread.currentThread().getName()+".............."+num);
            }
        }
    }
    
    • 结果:

      • image.png
    • Interrupt( ) :

      • image.png

    相关文章

      网友评论

          本文标题:停止线程(stop方法已经过时了)

          本文链接:https://www.haomeiwen.com/subject/orylpftx.html