1:先讲下join方法的作用: 调用join的线程可以使得其他线程等待自己运行结束,其他线程才会继续开始运行。
2:线程分为两类,用户线程和守护线程。用户线程就是比较常见的主线程、以及我们普通的后台任务处理线程。而守护线程则是为用户线程服务,比如 Eclipse里持续检测内存的使用情况等等。当时守护线程有个重要特点就是 当用户线程运行结束,守护线程会立即结束,无论守护线程里的人物是否执行完毕。
守护线程是用过给一个普通线程设置 setDaemon(true)实现。
下边给出具体代码:
MyThread.java 普通线程,用来测试join方法
package com.company;
class MyThread extends Thread{
public MyThread(String name)
{
super(name);
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " start");
for (int i=0; i < 50; ++i)
{
System.out.println(Thread.currentThread().getName() + " output #"+ i);
try {
sleep(500);//这里的延时是为了能使效果更明显
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " end");
}
}
DaemonThread.java 守护线程类
package com.company;
/**
* Created by renjingwei on 2015/8/23.
*/
public class DaemonThread extends Thread {
public DaemonThread(String name) {
super(name);
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " start");
for (int i = 0; i < 1000; ++i) {
System.out.println(Thread.currentThread().getName() + " output #" + i);
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " end");
}
}
Main.java
package com.company;
public class Main {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + " get start!!!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*****
注释的几行演示 线程的join用法: 调用线程会使得其他线程等待自己完成后 其他线程才会继续执行
// MyThread thread = new MyThread("MyThread");
// thread.start();
//
// try {
// thread.join();
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
/*********************************//
/******************************************
//主线程的守护线程,在主线程结束后,守护线程会立即停止
DaemonThread daemonThread = new DaemonThread("DaemonThread");
daemonThread.setDaemon(true);
daemonThread.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
*****************************/
System.out.println(Thread.currentThread().getName() + " end!!!!!");
}
}
运行结果,这里列举,挺长的。简单说下
join()的使用:MyThread在主线程上调用了join,此时 主线程就会等待MyThread执行完毕才会继续执行主线程的代码。
守护线程的使用: DeamonThread设置为主线程的守护线程,可以从log中看出,在主线程结束后,DaemonThread立即就结束了。