在上面的例子中多次利用到了Thread类的join要领。我想各人大概已经猜出来join要领的成果是什么了。对,join要领的成果就是使异步执行的线程酿成同步执行。也就是说,当挪用线程实例的start要领后,这个要了解当即返回,假如在挪用start要领后后需要利用一个由这个线程计较获得的值,就必需利用join要领。假如不利用join要领,就不能担保当执行到start要领后头的某条语句时,这个线程必然会执行完。而利用join要领后,直到这个线程退出,措施才会往下执行。下面的代码演示了join的用法。
package mythread;
public class JoinThread extends Thread
{
public static volatile int n = 0;
public void run()
{
for (int i = 0; i < 10; i++, n++)
try
{
sleep(3); // 为了使运行功效更随机,延迟3毫秒
}
catch (Exception e)
{
}
}
public static void main(String[] args) throws Exception
{
Thread threads[] = new Thread[100];
for (int i = 0; i < threads.length; i++) // 成立100个线程
threads[i] = new JoinThread();
for (int i = 0; i < threads.length; i++) // 运行适才成立的100个线程
threads[i].start();
if (args.length > 0)
for (int i = 0; i < threads.length; i++) // 100个线程都执行完后继承
threads[i].join();
System.out.println("n=" + JoinThread.n);
}
}
在例程2-8中成立了100个线程,每个线程使静态变量n增加10。假如在这100个线程都执行完后输出n,这个n值应该是1000。
1.测试1
利用如下的呼吁运行上面措施:
java mythread.JoinThread
措施的运行功效如下:
n=442
这个运行功效大概在差异的运行情况下有一些差别,但一般n不会便是1000。从上面的功效可以必定,这100个线程并未都执行完就将n输出了。
2.测试2
利用如下的呼吁运行上面的代码:
在上面的呼吁行中有一个参数join,其实在呼吁行中可以利用任何参数,只要有一个参数就可以,这里利用join,只是为了表白要利用join要领使这100个线程同步执行。
措施的运行功效如下:
n=1000
无论在什么样的运行情况下运行上面的呼吁,城市获得沟通的功效:n=1000。这充实说明白这100个线程必定是都执行完了,因此,n必然会便是1000。