public class Worker {
private Object obj1=new Object();
private Object obj2=new Object();
private List<Integer> list1=new ArrayList<Integer>();
private List<Integer> list2=new ArrayList<Integer>();
private Random random=new Random();
public void stageOne(){
synchronized (obj1) {
try {
Thread.sleep(1);
} catch (Exception e) {
// TODO: handle exception
}
list1.add(random.nextInt(100));
}
}
public void stageTwo(){
synchronized (obj2) {
try {
Thread.sleep(1);
} catch (Exception e) {
// TODO: handle exception
}
list2.add(random.nextInt(100));
}
}
public void process(){
for (int i = 0; i < 1000; i++) {
stageOne();
stageTwo();
}
}
public void main(){
System.out.println("starting.....");
long start=System.currentTimeMillis();
Thread t1=new Thread(){
public void run(){
process();
}
};
Thread t2=new Thread(){
public void run(){
process();
}
};
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (Exception e) {
// TODO: handle exception
}
long end=System.currentTimeMillis();
System.out.println("list1 "+list1.size()+"list2 "+list2.size());
System.out.println(end-start);
}
}
join的意思是连接,加入的意思
main是主线程,在main中创建了thread线程,在main中调用了thread.join(),那么等thread结束后再执行main代码。
在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了。
如果上述代码不加join方法,则main方法不会等待线程执行完,就会执行后面的打印操作 得到的数据
list1 0list2 0
0
在网上看到有人说“将两个线程合并”。这样解释我觉得理解起来还更麻烦。不如就借鉴下API里的说法:
“等待该线程终止。”
解释一下,是主线程(我在“一”里已经命名过了)等待子线程的终止。也就是在子线程调用了join()方法后面的代码,只有等到子线程结束了才能执行。(Waits for this thread to die.)