精通Java多线程学习(七)终止线程、守护线程

要想终止线程的运行,只有一种方法就是执行完run方法。

注意:stop方法强制终止线程容易引发安全隐患,不推荐使用。

interrupt可以清除线程的冻结状态(wait,sleep等)。

class StopThread implements Runnable{
    private boolean flag = true;

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    @Override
    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 class StopThreadDemo {
    public static void main(String[] args){
        StopThread thread = new StopThread();

        Thread t1 = new Thread(thread);
        Thread t2 = new Thread(thread);

        t1.start();
        t2.start();
        int num = 0;

        while (true){
            if (num ++ == 60){
                thread.setFlag(false);
                t1.interrupt();
                t2.interrupt();
                break;
            }
            System.out.println(Thread.currentThread().getName()+"......."+num);
        }
        System.out.println("over");
    }
}

守护线程:t1.setDaemon(true);//设置为守护线程,该方法必须在启动线程前调用。当正在运行的线程都是守护线程时,java虚拟机退出。

public class DaemonThread implements Runnable {
    @Override
    public void run() {
        int i = 0;
        while (i<1000){
            System.out.println(Thread.currentThread().getName()+":"+i++);
        }
    }
    public static void main(String[] args){
       DaemonThread thread1 = new DaemonThread();
       DaemonThread thread2 = new DaemonThread();

       Thread t1 = new Thread(thread1);
       Thread t2 = new Thread(thread2);

       t1.setDaemon(true);

       t1.start();
       t2.start();

    }
}

结果如下


通过结果我们可以知道:当线程1运行完之后,线程0还没有运行完就已经结束了。



猜你喜欢

转载自blog.csdn.net/qq_21963133/article/details/79645895