我们来看看线程的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 }