/*守护线程(后台线程):在一个进程中如果只剩下 了守护线程,那么守护线程也会死亡。 需求: 模拟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(); } }