2

我想同时启动几个可调用线程(循环中),并希望从主线程中的每个人那里返回一些信息。如何实现这一点?

4

4 回答 4

4

不可能从您的问题中说出最佳方法,因为我们对用例一无所知!但一般来说,您Executors.newFixedThreadPool()可以Callable<T>使用Future<T>.

然后,在主线程中,您可以遍历期货,调用每个get()将阻塞的方法,直到相应的可调用对象在线程池中完成执行。

于 2011-08-03T08:57:01.243 回答
1

在主线程中创建线程时,您可以保留对它们的引用并通过这些引用获取数据。伪代码如下所示:

int nSize = <some nomber>;
MyThread myThreadArray[] = new MyThread[nSize];

for(int i = 0; i < nSize; i++) {
  myThreadArray[i] = new MyThread();

  // Init and start the thread.
}

// Wait for all thread to end.

for(int i = 0; i < nSize; i++) {
  myThreadArray[i].getData();
}

可以使用任何类型的List来代替固定大小的数组。

编辑/添加:

除了将数据保存在子线程中,您还可以在主线程中分配它并在创建子线程时对其进行引用:

int nSize = <some nomber>;
MyThreadData myThreadDataArray[] = new MyThreadData[nSize];

for(int i = 0; i < nSize; i++) {
  Thread thread = new MyThread(myThreadDataArray[i]);

  // Init and start the thread.
}

// Wait for all thread to end.

for(int i = 0; i < nSize; i++) {
  // Do something with myThreadDataArray[i].
}

Thread如果您需要在线程终止后长时间使用线程数据,这将允许 gc 更快地回收对象。

于 2011-08-03T10:49:04.083 回答
0

据我了解,Java 中线程的启动和停止的优先级是不能保证的。一些线程在开始让位于另一个线程后可能会进入等待模式,这可能是因为它正在等待 I/O。

这是我问过的一些问题,它们可能有你想要的 - 使用循环同时启动线程。

为什么线程 10000 start() 调用比 10000 run() 调用花费更多时间?

于 2011-08-03T09:13:10.983 回答
0

我不知道你的要求是什么。但我可以给你一些小路。您可以为每个线程生成唯一的 id 并将具有空值字段的 id 放在(数据库)某处。并使生成的线程更新它们所属的表(id)。之后您可以检查值是否更新并获得价值。

于 2011-08-03T10:28:01.917 回答