停止线程和守护线程(传智播客)

一.停止线程
1.标记停止线程
原有的stop和suspend方法存在固有的安全性问题,尤其是suspend有死锁倾向。

public class StopThread implements Runnable{
    private boolean flag = true;
    @Override
    public void run() {
        while(flag){
            System.out.println(Thread.currentThread()+"...run...");
        }
    }

    public void changeFlag(){
        this.flag = false;
    }

    public static void main(String[] args) {
        StopThread st = new StopThread();
        Thread t0 = new Thread(st);
        Thread t1 = new Thread(st);
        t0.start();
        t1.start();
        int num = 1;
        for(;;){
            if(++num==50){
                st.changeFlag();
                break;
            }
            System.out.println("main..."+num);
        }
        System.out.println("over");
    }
}

在代码中让线程进入冻结状态,这种方法有停不下来的时候。

2.interrupt方法结束线程
可以使用interrupt方法将线程从冻结状态强制恢复到运行状态,让线程具备cpu执行资格。但是这种操作是强制性的,会造成InterruptedException,需要进行处理,如在本例中的读取标记。

public class StopThread implements Runnable{
    private boolean flag = true;
    @Override
    public synchronized void run() {
        while(flag){
            try{
                wait();
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread()+e.toString());
                flag = false;
            }
            System.out.println(Thread.currentThread()+"...run...");
        }
    }

    public void changeFlag(){
        this.flag = false;
    }

    public static void main(String[] args) {
        StopThread st = new StopThread();
        Thread t0 = new Thread(st);
        Thread t1 = new Thread(st);
        t0.start();
        t1.start();
        int num = 1;
        for(;;){
            if(++num==50){
                t0.interrupt();
                t1.interrupt();
                break;
            }
            System.out.println("main..."+num);
        }
        System.out.println("over");
    }
}

二.守护线程
守护线程又称为用户线程或者后台线程,它的创建和运行状态和其它线程一样,但是只要前台线程(系统线程)全部结束,那么无论守护线程处于何种状态都自动结束。当一个正在运行的java程序内所有的线程都为守护线程时,jvm退出。

public class StopThread implements Runnable{
    private boolean flag = true;
    @Override
    public synchronized void run() {
        while(flag){
            try{
                wait();
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread()+e.toString());
                flag = false;
            }
            System.out.println(Thread.currentThread()+"...run...");
        }
    }

    public void changeFlag(){
        this.flag = false;
    }

    public static void main(String[] args) {
        StopThread st = new StopThread();
        Thread t0 = new Thread(st);
        Thread t1 = new Thread(st);
        t0.start();
        t1.setDaemon(true);
        t1.start();
        int num = 1;
        for(;;){
            if(++num==50){
                t0.interrupt();
                break;
            }
            System.out.println("main..."+num);
        }
        System.out.println("over");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章