设为首页 加入收藏

TOP

Java主线程等待子线程、线程池 (二)
2014-11-24 10:24:25 】 浏览:10879
Tags:Java 线程 等待
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

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇eclipse/myeclipse使用技巧 下一篇Java建议:推荐使用String直接量..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目