JAVA学习(停止线程,守护线程,join方法)

一、停止线程

1.stop方法,类Thread的方法,已经过时,该方法具有固有的不安全性,使用该方法来终止线程将释放它锁定的的所有监视器,该方法是强制性的。

2.run方法结束。线程的任务没有了,线程自动就结束了。

如何控制线程的任务结束:

任务中都会有循环结构,只要控制住循环就可以结束任务。

控制循环通常就用定义标记来完成。

 

但是如果线程处于冻结状态,无法读取标记,如何结束。

 

例如:

public class StopThread implements Runnable{       
    private boolean flag = true;              //定义标记
    public void run(){
        while(flag){
            System.out.println(Thread.currentThread().getName()+"run");
        }
    }
    public void setFlag (){               //定义方法修改定义标记
        flag = false;
    }
}

public class MarkDemo {
    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;
        for (int x=0;x<999999999;x++){
            System.out.println(x);
            if(++num==20000){
                st.setFlag();
                break;
            }
        }
    }
}

3.interrupt中断线程

可以使用interrupt()方法将线程从冻结状态强制恢复到运行状态,让线程具备CPU执行资格。

但是该强制动作会发生InterruptedException,记得要处理。

例如:

public class StopThread implements Runnable{
    private boolean flag = true;
    public void run(){
        while(flag){
            try{
                wait();        //开启线程后执行run方法后,进入冻结状态。
            }
            catch (InterruptedException e) {
                System.out.println(Thread.currentThread().getName() + "...."+e);
                flag = false;      //使用interrupt方法消除冻结后,捕捉异常,执行方法,此时修改定义标记,将run方法结束循环,线程自动结束。
            }
            System.out.println(Thread.currentThread().getName()+"......+++++");
        }
    }
    public void setFlag (){
        flag = false;
    }
}

public class MarkDemo {
    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;
        for (int x=0;x<999999999;x++){
            System.out.println(x);
            if(++num==20000){
                t1.interrupt();    //消除t1的冻结状态
                t2.interrupt();    //消除t2的冻结状态
                break;
            }
        }
        System.out.println("over");
    }
}

 

二、守护线程setDaemon (后台进程)

只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。

 

三、join方法

join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。

 

join()方法可以传入参数,参数代表A线程中调用B线程的join方法时,A线程等待B线程的时间。单位是毫秒。

posted @ 2021-04-06 20:36  金芒果决斗  阅读(209)  评论(0编辑  收藏  举报