Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-将完成的线程对象分配给新线程_Java_Multithreading_Threadpool - Fatal编程技术网

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

Java-将完成的线程对象分配给新线程,java,multithreading,threadpool,Java,Multithreading,Threadpool,好的,标题的措辞有点奇怪,但我真的不知道如何表达它。基本上,从我对Java和线程的理解来看,你创建一个线程,它运行,它消亡。但是,线程对象仍然存在。我想知道的是这样的东西是否有效 int numWorkers = Integer.parseInt(args[0]); int threadPoolSize = Integer.parseInt(args[1]); ExecutorService tpes = Executors.newFixedThreadPool(threadPoolSize);

好的,标题的措辞有点奇怪,但我真的不知道如何表达它。基本上,从我对Java和线程的理解来看,你创建一个线程,它运行,它消亡。但是,线程对象仍然存在。我想知道的是这样的东西是否有效

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]);
    }
int numWorkers=Integer.parseInt(args[0]);
int threadPoolSize=Integer.parseInt(args[1]);
ExecutorService tpes=Executors.newFixedThreadPool(threadPoolSize);
WorkerThread[]workers=新WorkerThread[numWorkers];
虽然(某些条件)
for(int i=0;i

基本上,这种情况是,我们有一些条件,我们不知道什么时候会得到满足。假设我使用了8个线程。我创建了所有8个线程,它们完成任务并返回。我把他们的结果放在一起,意识到我还没有完成。但是,例如,工人[0]已经存在。我用一个新的WorkerThread()调用创建了它。但它已经死了,因为它已经跑完了。如果我再次调用workers[0]=newworkerThread(0,new参数)…允许这样做吗?我需要更多的线程,我已经有一个数组(现在)死线程…我能不能把它们指向其他东西?GC是否正确收集了旧线程?

第一件事:您不向Executor服务提交线程。您可以提交任务,这些任务只是实现
运行的对象。Executor服务完全控制线程池


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

第一件事:您不向Executor服务提交线程。您可以提交任务,这些任务只是实现
运行的对象。Executor服务完全控制线程池


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

+1有时我想知道从哪里开始,答案应该放在哪里。@amitD我知道这样的感觉:)很多时候,人们只需要缩小问题的文本。对此表示抱歉。我对遗嘱执行人的理解是不稳定的,因为我昨天才真正了解他们。但是在这种情况下,执行者负责实际创建和管理线程?我只需要指定线程每次应该做什么?我想我之所以感到困惑是因为和Executor调用execute(某个线程)。您必须向它传递一个线程(或一些扩展的可运行线程),所以我认为您实际上是在提交线程。如果不是这样的话,我想在这种情况下它是有效的。我有8个线程在运行,但我不知道我最终会提交多少任务,但即使我提交更多,它们也只是在等待一个线程自由运行它们。这种理解是否更接近实际情况?我看到您对
线程
可运行
之间的区别感到困惑
Runnable
只是一个声明单个
void run()
方法的简单接口,而
Thread
是一个管理系统资源(执行线程)的重量级对象。如果您碰巧将
Thread
的实例传递给ExecutorService,它仍然与该对象管理的实际执行线程无关:ExecutorService将只看到
run
方法,它会在自己的一个线程上调用它。+1有时我想知道从哪里开始,在答案中加入什么。@amitD我知道这种感觉:)很多时候,人们需要缩小问题的文本。对此我很抱歉。我对遗嘱执行人的理解是不稳定的,因为我昨天才真正了解他们。但是在这种情况下,执行者负责实际创建和管理线程?我只需要指定线程每次应该做什么?我想我之所以感到困惑是因为和Executor调用execute(某个线程)。您必须向它传递一个线程(或一些扩展的可运行线程),所以我认为您实际上是在提交线程。如果不是这样的话,我想在这种情况下它是有效的。我有8个线程在运行,但我不知道我最终会提交多少任务,但即使我提交更多,它们也只是在等待一个线程自由运行它们。这种理解是否更接近实际情况?我看到您对
线程
可运行
之间的区别感到困惑
Runnable
只是一个声明单个
void run()
方法的简单接口,而
Thread
是一个管理系统资源(执行线程)的重量级对象。如果您碰巧将
Thread
的实例传递给ExecutorService,它仍然与该对象管理的实际执行线程无关:ExecutorService将只看到
run
方法,它将在自己的一个线程上调用它。