Java-将完成的线程对象分配给新线程

时间:2012-10-28 17:03:53

标签: java multithreading threadpool

好吧,标题的措辞有点奇怪,但我真的不知道如何表达它。基本上,从我对Java和线程的理解是你创建一个线程,它运行,它死了。但是,线程OBJECT仍然存在。如果这样的事情有效,我想知道

int numWorkers = Integer.parseInt(args[0]);
int threadPoolSize = Integer.parseInt(args[1]);
ExecutorService tpes = Executors.newFixedThreadPool(threadPoolSize);
WorkerThread[] workers = new WorkerThread[numWorkers];
while(some condition)    
    for (int i = 0; i < numWorkers; i++) {
        workers[i] = new WorkerThread(i, *some changing parameters*);
        tpes.execute(workers[i]);
    }

基本上这种情况是我们有一些条件,我们不知道何时会满足。假设我使用8个线程。我创建所有8个线程,他们做他们的事情并返回。我把他们的结果放在一起,意识到我还没有完成。但是,例如,worker [0]已经存在。我用一个新的WorkerThread()调用创建了它。但它现在已经死了,因为它已经完成了。如果我打电话,AGAIN,工人[0] =新的WorkerThread(0,新参数)......是允许的吗?我需要更多线程,我已经有一个已经(现在)死线程的数组......我可以将它们指向其他东西吗? GC是否正确收集旧线程?

1 个答案:

答案 0 :(得分:5)

首先要做的事情是:您没有将线程提交给Executor服务。您提交任务,这些只是实施run的对象。 Executor Service完全控制线程池。

您可以轻松安排相同的Runnable任意次,每次您收到另一个FutureTask对象,告诉您是否已完成,并允许您取消它。这些FutureTask对象不可重用,但这没问题。