我想在同一时间(循环中)启动几个可调用线程,并希望从主线程中的每个人返回一些信息。怎么实现这个?
答案 0 :(得分:3)
从你的问题中说出最好的方法是不可能的,因为我们对用例一无所知!但一般来说,您可以使用Executors.newFixedThreadPool()
创建一个线程池,然后将通用Callable<T>
对象提交给线程池 - 您将获得Future<T>
。
在主线程中,您可以循环遍历future,调用将阻塞的get()
方法中的每一个,直到相应的callable在线程池中完成执行。
答案 1 :(得分: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].
}
如果你需要在线程终止后长时间使用线程数据,这将允许gc更快地回收Thread
个对象。
答案 2 :(得分:0)
以下是我提出的一些可能有你想要的问题 - 使用循环同时启动线程。
Why is it that threads 10000 start() calls take more time than 10000 run() calls?
答案 3 :(得分:0)
我不知道你的要求是什么。但我可以给你一点路径。你可以为每个线程生成唯一的id,并将那个带有null值字段的id放在(database)somewhere.And生成的线程来更新它们所属的表(id)。之后你可以检查值是否更新并获得价值。