标签:package catch 主线程 nbsp load star new block stat
我们来看看线程的join方法:
如果,没有join,代码如下,那么其运行效果如下:
1 package com.hw.thread0223;
2
3 public class ThreadDemo2 {
4 public static void main(String[] args) {
5 MyThread t1 = new MyThread("线程1");
6 MyThread t2 = new MyThread("线程2");
7
8 t1.start();
9
10 t2.start();
11
12 System.out.println("Main end");
13 }
14 }
我们可以看到,主线程里面,程序是会先运行System.out.println("Main end");这行代码,但是,如果我调用t1的join方法,运行效果就不一样了:
1 package com.hw.thread0223;
2
3 public class ThreadDemo2 {
4 public static void main(String[] args) {
5 MyThread t1 = new MyThread("线程1");
6 MyThread t2 = new MyThread("线程2");
7
8 t1.start();
9 try {
10 t1.join();
11 } catch (InterruptedException e) {
12 // TODO Auto-generated catch block
13 e.printStackTrace();
14 }
15 t2.start();
16
17 System.out.println("Main end");
18 }
19 }
现在我们来看看join方法究竟是什么:
join方法在线程里面意味着“插队”,哪个线程调用join代表哪个线程插队先执行。比如系统目前运行线程A,在线程A里面调用了线程B.join方法,则接下来线程B会抢先在线程A面前执行,等到线程B全部执行完后才继续执行线程A。就是这么回事儿。
我们再来看看守护线程:
守护线程顾名思义,就是用来守护的。比如说,我把t2设置为守护线程,那么t2会一直守护着t1,直到t1运行结束之后,不管t2有没有运行完,都会停止。我们来看看:
1 package com.hw.thread0223;
2
3 public class ThreadDemo2 {
4 public static void main(String[] args) {
5 MyThread t1 = new MyThread("线程1");
6 MyThread t2 = new MyThread("线程2");
7
8 t1.start();
9
10 t2.setDaemon(true);
11 t2.start();
12
13 System.out.println("Main end");
14 }
15 }
可以看到,t2并没有运行完,而是一路守护着t1运行完毕。
标签:package catch 主线程 nbsp load star new block stat
原文地址:https://www.cnblogs.com/EvanTheGreat/p/14443607.html