关于运行的带阻塞队列的线程池,如何知道 交给他的 所有任务 全部完成 然后正确关闭线程池

你是错的我恒对 发布于 2014/01/22 19:59
阅读 1K+
收藏 1

我也在学并发,遇到很多问题,其中一个是  如何获知  一个有阻塞队列10个大小的线程池,执行1000个任务 全部完成 的终结时间,然后在终结时间将线程池正确关闭

现在我没法获知终结时间

比如我看http://ifeve.com/java-concurrency-thread-directory/并发编程网,用的他们写的线程池

声明一个 10个线程大小的线程池,然后假如我声明实例化了1000个runnable 放到线程池里,用eclipse跑,结果1000个执行完,console 还是显示在运行,如何获知这1000个任务全部完成呢? 然后再将线程池关闭?



加载中
0
逝水fox
逝水fox

如果说的是JDK自带的ExecutorService,那么提交任务不要用Runnable而是用Callable<T>(或者你自己实现个Callable<T>把Runnable封装了),每个任务在完成自己要做的事情之后,return 当前时间。然后你通过submit()方法返回的Future<T>对象获取这个返回值把它当作该任务的终结时间,最后就是一个求最大值的问题了...

你是错的我恒对
你是错的我恒对
嗯,谢谢哈,好好看看
0
你是错的我恒对
你是错的我恒对

引用来自“逝水fox”的答案

如果说的是JDK自带的ExecutorService,那么提交任务不要用Runnable而是用Callable<T>(或者你自己实现个Callable<T>把Runnable封装了),每个任务在完成自己要做的事情之后,return 当前时间。然后你通过submit()方法返回的Future<T>对象获取这个返回值把它当作该任务的终结时间,最后就是一个求最大值的问题了...

我看书看的慢,Executor框架不会用,用的那个网站实现的简单的线程池,唉,改天看看Executor框架源码,在改过到Executor框架

最大值是啥意思?我没明白你的意思额= =|,能详细点吗?

我看书上讲到 executorservice  有个 invokeall方法,可以返回所有的Callable任务的future,而且在所有任务完成时

还有啊,你学Executor 框架 是工作中遇到的? 还是自学的啊? 我现在这家公司 我在的组,什么东西都不用,只做最多2个关联表的crud,太无脑了

0
中山野鬼
中山野鬼
哈,你要学这个,建议还是用c,折腾进程,先把并发、同步等概念能用例子做清楚了再说。线程,我是能不用就不用,更不建议小朋友上手用。
0
你是错的我恒对
你是错的我恒对

引用来自“中山野鬼”的答案

哈,你要学这个,建议还是用c,折腾进程,先把并发、同步等概念能用例子做清楚了再说。线程,我是能不用就不用,更不建议小朋友上手用。

我学这个为了抓取数据,做网站,原理也不想弄懂了,会用就好

今天弄php东西,感觉自己本来是样样懂,结果却是样样都不懂,什么东西都得查,边查边写,还遇到各种问题,在北京一年,感觉跟自己刚来北京时候没多大差别,就是搞懂了jquery,其他会用点工具,现在都想回家找个工作安稳过日子了,唉

0
中山野鬼
中山野鬼

引用来自“edit”的答案

引用来自“中山野鬼”的答案

哈,你要学这个,建议还是用c,折腾进程,先把并发、同步等概念能用例子做清楚了再说。线程,我是能不用就不用,更不建议小朋友上手用。

我学这个为了抓取数据,做网站,原理也不想弄懂了,会用就好

今天弄php东西,感觉自己本来是样样懂,结果却是样样都不懂,什么东西都得查,边查边写,还遇到各种问题,在北京一年,感觉跟自己刚来北京时候没多大差别,就是搞懂了jquery,其他会用点工具,现在都想回家找个工作安稳过日子了,唉

原理很重要。这里喷我的多半没吃过苦。哈。
0
bitbone
bitbone

这和N个人加班,都加完班后锁门是一个道理。想想,一种办法是让保安不断查看还有人加班不,没人了就锁门;还有一种办法,每个人加完班后都看看还有人加班不,没有了他就是最后一个,他就锁门。再想想还有什么办法? 

你是错的我恒对
你是错的我恒对
嗯嗯
0
小野ye
小野ye
好像有个countdown...java里面的
0
13123123
13123123
 请问  你helloword 会写不
0
骨头bone
骨头bone

建议不要使用concurrent库,仅使用thread原生api,能够方便你理解和控制。

如在本问题中:

使用1个主线程添加和分配任务,10个工作线程去做任务。

主线程使用队列来接收和分配任务,并控制程序逻辑,如进行了1000个任务后停止等。

工作线程就轮寻的从队列中获取任务,然后进行任务。

尽量保持线程的职责单一,如工作线程只负责完成任务,可以避免使用synchronized,lock等


0
yanchao90
yanchao90
public class BSync {

	private Integer totalThreads;
	private Integer currentThreads;

	public BSync(Integer totalThreads) {
		this.totalThreads = totalThreads;
		this.currentThreads = 0;
	}

	public synchronized void waitForAll() {
		currentThreads++;
		if (currentThreads < totalThreads) {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		} else {
			currentThreads = 0;
			notifyAll();
			System.out.println("All Thread Finished.");
		}
	}
}

public static void main(String[] args) {

		int totalThreads = 100;

		final BSync sync = new BSync(totalThreads);
		for (int i = totalThreads; i > 0; i--) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					System.out.println(this + "doing somthing.");
					System.out.println(this + " finished & waiting.");
					sync.waitForAll();
				}
			}).start();
		}
	}





返回顶部
顶部