【问题标题】:Java- Assigning finished thread objects to new threadsJava-将完成的线程对象分配给新线程
【发布时间】:2012-10-29 01:05:44
【问题描述】:

好吧,标题的措辞有点奇怪,但我真的不知道如何表达。基本上,根据我对 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 是否正确收集旧线程?

【问题讨论】:

    标签: java multithreading threadpool


    【解决方案1】:

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

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

    【讨论】:

    • +1 有时我想知道从哪里开始以及在答案中添加什么。
    • @amitD 我知道这种感觉 :) 很多时候人们需要缩小问题的文字文本。
    • 很抱歉。我对 Executors 的理解是不稳定的,因为我昨天才真正了解它们。但是在那种情况下,Executor 负责实际创建和管理线程呢?我只需要指定线程每次应该做什么?
    • 我想我为什么会感到困惑是因为 Executor 调用了执行(某个线程)。您必须向它传递一个线程(或扩展可运行的东西),所以我认为您实际上是在提交线程。如果不是这种情况,我想在这种情况下它可以工作。我有 8 个线程正在运行,但我不知道我最终会提交多少任务,但即使我提交更多,它们也只是等到一个线程空闲来运行它们。这种理解是否更接近实际发生的情况?
    • 我看到您对ThreadRunnable 之间的区别感到困惑。 Runnable 只是一个简单的接口,声明了一个 void run() 方法,而 Thread 是管理系统资源(执行线程)的重量级对象。如果您碰巧将Thread 的实例传递给ExecutorService,它仍然与该对象管理的实际执行线程无关:ExecutorService 只会看到run 方法,它会调用它在它自己的线程之一上
    猜你喜欢
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2017-10-23
    相关资源
    最近更新 更多