好吧,标题的措辞有点奇怪,但我真的不知道如何表达它。基本上,从我对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是否正确收集旧线程?
答案 0 :(得分:5)
首先要做的事情是:您没有将线程提交给Executor服务。您提交任务,这些只是实施run
的对象。 Executor Service完全控制线程池。
您可以轻松安排相同的Runnable
任意次,每次您收到另一个FutureTask
对象,告诉您是否已完成,并允许您取消它。这些FutureTask
对象不可重用,但这没问题。