版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011541946/article/details/82263175
继续学习线程类的相关实例方法,这篇学习守护线程和加入线程两种方法的基本使用。
1.守护线程
在线程类有一个方法加setDaemon(), 作用就是设置一个线程为守护线程,该线程不会单独执行,当其他非守护线程都执行结束之后,守护线程自动退出。下面,两个线程代码,t1表示非守护线程,t2表示守护线程。
package thread;
public class Demo5_Daemon {
public static void main(String[] args) {
Thread t1 = new Thread() {
public void run() {
for (int i = 0; i < 2; i++) {
System.out.println(this.getName() + ":aaaaa");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread t2 = new Thread() {
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(this.getName() + ":bbbbbb");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t2.setDaemon(true); //true就设置为守护线程
t1.start();
t2.start();
}
}
上面表示,T2是守护线程,T2是非守护,所以T1执行两次打印aaa之后,T2不可能全部执行打印50次bbbb。这样说可能有点绕,T2这个相当于就是象棋中的将帅,T1相当于是非守护的,因为只有将帅没有守护好而挂了,那么其他什么兵马车跑都没有存在意义,自动挂了。
运行结果可能如下,确实每次运行结果不一样,当发现T1解析,T2还需要一些反应时间去自动退出进程,有点延迟现象。
Thread-1:bbbbbb
Thread-0:aaaaa
Thread-1:bbbbbb
Thread-0:aaaaa
Thread-1:bbbbbb
2.加入线程
加入线程用join()方法,也就是线程插队。下面打印了三次bbb之后,把t2插队到t1里面,等t2全部执行完,然后执行t1.
package thread;
public class Demo6_Join {
public static void main(String[] args) {
Thread t1 = new Thread() {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(this.getName() + ":aaaaa");
}
}
};
Thread t2 = new Thread() {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(this.getName() + ":bbbbbb");
if(i == 2) {
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
};
t1.start();
t2.start();
}
}
运行结果可能是:
Thread-0:aaaaa
Thread-0:aaaaa
Thread-1:bbbbbb
Thread-0:aaaaa
Thread-1:bbbbbb
Thread-0:aaaaa
Thread-1:bbbbbb
Thread-0:aaaaa
Thread-0:aaaaa
Thread-0:aaaaa
Thread-0:aaaaa
Thread-0:aaaaa
Thread-0:aaaaa
Thread-1:bbbbbb
Thread-1:bbbbbb
Thread-1:bbbbbb
Thread-1:bbbbbb
Thread-1:bbbbbb
Thread-1:bbbbbb
Thread-1:bbbbbb