线程的其他设置

2021-03-01 13:26

阅读:495

标签: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


评论


亲,登录后才可以留言!