我想同时启动几个可调用线程(循环中),并希望从主线程中的每个人那里返回一些信息。如何实现这一点?
问问题
986 次
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。
这是我问过的一些问题,它们可能有你想要的 - 使用循环同时启动线程。
于 2011-08-03T09:13:10.983 回答
0
我不知道你的要求是什么。但我可以给你一些小路。您可以为每个线程生成唯一的 id 并将具有空值字段的 id 放在(数据库)某处。并使生成的线程更新它们所属的表(id)。之后您可以检查值是否更新并获得价值。
于 2011-08-03T10:28:01.917 回答