首页 > 技术文章 > 线程的其他设置

EvanTheGreat 2021-02-24 20:22 原文

我们来看看线程的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运行完毕。

 


 

除此之外,还有线程的中断:

我们可以调用interrupted方法,但是需要自己主动做一些处理:

ThreadDemo2.java:

 1 package com.hw.thread0223;
 2 
 3 public class ThreadDemo2 {
 4     public static void main(String[] args) throws InterruptedException {
 5         MyThread t1 = new MyThread("线程1");
 6         MyThread t2 = new MyThread("线程2");
 7     
 8         t1.start();
 9         
10         Thread.sleep(1);
11         t1.interrupt();
12         
13         t2.start();
14         
15         System.out.println("Main end");
16     }
17 }

MyThread.java:

 1 package com.hw.thread0223;
 2 
 3 public class MyThread extends Thread{
 4     public MyThread(String name){
 5         super(name);
 6     }
 7     
 8     public MyThread(){
 9         
10     }
11     
12     public void run(){
13         for(int i = 0;i < 100;i++)
14         {
15             if(interrupted()){    //判断线程当前是否处于中断状态,如果是的话,自己主动处理,break掉
16                 System.out.println("释放资源");
17                 break;
18             }
19             System.out.println(getName()+":"+i);
20         }
21     }
22 }

 

 

推荐阅读