在多线程的编程中,我们会遇到需要使用join()的情况,在我的理解里就是在并行的状态下进行串行运行。
public final void join()
throws InterruptedException
//等待该线程终止。
该方法会抛出中断异常,实际上是应为join是利用wait()函数来构造的。即当前线程调用目标线程的wait(),造成当前线程的阻塞,但是不会影响其他线程的并行,这句话可能有点难理解,举两个例子。
class joindemo
{
public static void main(String[] args)
{
demo d=new demo();
Thread t1=new Thread(d);
Thread t2=new Thread(d);
t1.start();
try
{
t1.join();
}
catch (InterruptedException e)
{
}
t2.start();
for(int i=50;i>0;i--)
System.out.println(Thread.currentThread().getName()+"..."+i);
}
}
class demo implements Runnable
{
public void run()
{
for(int i=50;i>0;i--)
{
System.out.println(Thread.currentThread().getName()+"..."+i);
}
}
}
代码中三个线程,运行结果如下
可以明显看到,t1线程结束其他两个线程才开始并行运行,从这里来看t2也受影响,其实t2没有受到影响,是因为主线程停住了,导致t2无法开启。如果先开启t2,再t1.join(),就可以发现如下情况。
一句话哪个线程里有其他线程join,哪个线程就阻塞,形象一点就是,你在排队呢,别人插队,你就得等插队的人先排完,毕竟是文明人不能和社会人计较。