0

好吧,标题的措辞有点奇怪,但我真的不知道如何表达它。基本上,根据我对 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() 调用创建了它。但它现在已经死了,因为它已经完成了运行。如果我再次打电话,workers[0] = new WorkerThread(0, new parameter )...是否允许?我需要更多线程,我已经有一个(现在)死线程数组......我可以将它们指向其他东西吗?GC 是否正确收集了旧线程?

4

1 回答 1

5

首先要做的事情是:您不会将线程提交给执行器服务。您提交任务,这些任务只是实现的对象run。Executor Service 完全控制线程池。

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

于 2012-10-28T17:05:44.607 回答