多线程中的join方法的含义

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.)

猜你喜欢

转载自blog.csdn.net/faker____/article/details/82887782