前端时间,听同事说了thread join 这个方法,遂尝试了下。
测试代码如下:
public class TestThreadJoin {
public static boolean testJoinTime = true;
public static void main(String[] args) {
int all = 5;
Thread[] ts = new Thread[all];
long start_time = System.currentTimeMillis();
for (int a = 0; a < all; a++) {
final int tmp = a ;
ts[a] = new Thread(new Tjoin(tmp));
ts[a].start();
}
for(Thread t : ts){
try {
if(TestThreadJoin.testJoinTime){
t.join(20000L);
}else{
t.join();
}
} catch (InterruptedException e) {
}
}
System.out.println("..........all is ok........用时:"+ (System.currentTimeMillis() - start_time));
for(Thread t : ts){
t.interrupt();
}
}
static class Tjoin implements Runnable {
long wait_time = 0;
long start_time = 0;
public Tjoin() {
}
public Tjoin(int wait_time) {
this.wait_time = wait_time;
this.start_time = System.currentTimeMillis();
}
@Override
public void run() {
if(wait_time == 4){
try {
if(TestThreadJoin.testJoinTime){
Thread.sleep(1000000L);
}
} catch (InterruptedException e) {
System.err.println("我被终止了。。。");
}
}
try {
Thread.sleep(wait_time * 1000);
// System.out.println("线程 "+ wait_time);
} catch (InterruptedException e) {
}
System.out.println("线程 "+ wait_time+ " 结束了...用时:"+ (System.currentTimeMillis() - start_time));
}
}
}
线程 0 结束了...用时:0
线程 1 结束了...用时:1000
线程 2 结束了...用时:2000
线程 3 结束了...用时:3000
线程 4 结束了...用时:4000
..........all is ok........用时:4000
以前不知道有该方法,都是采取在run方法结束时,改变全局或者外部标志位的方式,来确认所有线程的完成情况。
现在有了这个方法,妈妈再也不担心我判断线程是否运行结束了。。。
后续又做了 join(long millis) 方法的测试,设置testJoinTime 为true,输出结果如下:
线程 0 结束了...用时:0
线程 1 结束了...用时:1000
线程 2 结束了...用时:2000
线程 3 结束了...用时:3000
..........all is ok........用时:23016
我被终止了。。。
线程 4 结束了...用时:27000
因为工作涉及的技术比较单调。。所以也写不出太具体的用处。
但是个人感觉,如果有以下需求时,可以利用这个东东:
1、处理大量数据,又对时效性需求较高,一般可用join(),但是如果对时间要求更严苛,则可以用join(long millis) 控制总体时间;
2、多线程协同任务时,最终结果输出为多线程输出结果的加和。。
第一次写文章,废话比较多。。。慢慢努力吧~致力于成为一个成功的屌丝!
辛苦大家的眼睛了。。