Java中的后台线程和join方法

/*守护线程(后台线程):在一个进程中如果只剩下 了守护线程,那么守护线程也会死亡。
需求: 模拟QQ下载更新包。
一个线程默认都不是守护线程。
*/
public class Demo extends Thread {
    public Demo(String name){
        super(name);
    }
    @Override
    public void run() {
        for(int i = 1 ; i<=100 ; i++){
            System.out.println("更新包目前下载"+i+"%");
            if(i==100){
                System.out.println("更新包下载完毕,准备安装..");
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
         Demo d = new Demo("后台线程");
         d.setDaemon(true); //setDaemon() 设置线程是否为守护线程,true为守护线程, false为非守护线程。
        // System.out.println("是守护线程吗?"+ d.isDaemon()); //判断线程是否为守护线程。
         d.start();
         for(int i = 1 ; i<=100 ; i++){
             System.out.println(Thread.currentThread().getName()+":"+i);
         }
    }
}

线程中的join方法:

/*
 join方法。 加入
*/

//老妈
class  Mon extends Thread{
    public void run() {
        System.out.println("妈妈洗菜");
        System.out.println("妈妈切菜");
        System.out.println("妈妈准备炒菜,发现没有酱油了..");
        //叫儿子去打酱油
        Son s= new Son();
        s.start();
        try {
            s.join();  //加入。 一个线程如果执行join语句,那么就有新的线程加入,执行该语句的线程必须要让步给新加入的线程先完成任务,然后才能继续执行。
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("妈妈继续炒菜");
        System.out.println("全家一起吃饭..");        
    }
} 

class Son extends Thread{
    @Override
    public void run() {
        System.out.println("儿子下楼..");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("儿子一直往前走");
        System.out.println("儿子打完酱油了");
        System.out.println("上楼,把酱油给老妈");
    }
}

public class Demo {
    public static void main(String[] args) {
        Mon m = new Mon();
        m.start();
    }
}

猜你喜欢

转载自www.cnblogs.com/qicao/p/9074235.html