ce();
}
}
long end = System.currentTimeMillis();
System.out.println("子线程执行时长:" + (end - start));
}
}
在上面的代码套上一个for循环,执行结果:
Thread-0子线程开始
Thread-0子线程结束
Thread-1子线程开始
Thread-1子线程结束
Thread-2子线程开始
Thread-2子线程结束
Thread-3子线程开始
Thread-3子线程结束
Thread-4子线程开始
Thread-4子线程结束
子线程执行时长:25000
由于thread.join()阻塞了主线程继续执行,导致for循环一次就需要等待一个子线程执行完成,而下一个子线程不能立即start(),5个子线程不能并发。
要想子线程之间能并发执行,那么需要在所有子线程start()后,在执行所有子线程的join()方法。
[java] public class Main
{
public static void main(String[] args)
{
long start = System.currentTimeMillis();
List list = new ArrayList();
for(int i = 0; i < 5; i++)
{
Thread thread = new TestThread();
thread.start();
list.add(thread);
}
try
{
for(Thread thread : list)
{
thread.join();
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("子线程执行时长:" + (end - start));
}
}
public class Main
{
public static void main(String[] args)
{
long start = System.currentTimeMillis();
List list = new ArrayList();
for(int i = 0; i < 5; i++)
{
Thread thread = new TestThread();
thread.start();
list.add(thread);
}
try
{
for(Thread thread : list)
{
thread.join();
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("子线程执行时长:" + (end - start));
}
}
执行结果:
Thread-0子线程开始
Thread-3子线程开始
Thread-1子线程开始
Thread-2子线程开始
Thread-4子线程开始
Thread-3子线程结束
Thread-0子线程结束
Thread-2子线程结束
Thread-1子线程结束
Thread-4子线程结束
子线程执行时长:5000
3、主线程等待多个子线程(CountDownLatch实现)
CountDownLatch是java.util.concurrent中的一个同步辅助类,可以把它看做一个倒数计数器,就像神舟十号发射时倒数:10,9,8,7….2,1,0,走你。初始化时先设置一个倒数计数初始值,每调用一次countDown()方法,倒数值减一,await()方法会阻塞当前进程,直到倒数至0。
同样还是主线程等待5个并发的子线程。修改上面的代码,在主线程中,创建一个初始值为5的CountDownLatch,并传给每个子线程,在每个子线程最后调用countDown()方法对倒数器减1,当5个子线程等执行完成,那么CountDownLatch也就倒数完成,主线程调用await()方法等待5个子线程执行完成。
修改MyThread接收传入的CountDownLatch:
[java] public class TestThread extends Thread
{
private CountDownLatch countDownLatch;
public TestThread(CountDownLatch countDownLatch)
{
this.countDownLatch = countDownLatch;
}
public void run()
{
System.out.println(this.getName() + "子线程开始");
try
{
// 子线程休眠五秒
Thread.sleep(5000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
// 倒数器减1
countDownLatch.countDown();
System.out.println(this.getName() + "子线程结束");
}
}
public class TestThread extends Thread
{
private CountDownLatch countDownLatch;
public TestThread(CountDownLatch countDownLatch)
{
this.countDownLatch = countDownLatch;
}
public void run()
{
System.out.println(this.getName() + "子线程开始");
try
{
// 子线程休眠五秒
Thread.sleep(5000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
// 倒数器减1
countDownLatch.countDown();
System.out.println(this.getName() + "子线程结束");
}
}
修改main:
[java] public clas