如何从多个线程获取信息? Java的

时间:2011-08-03 08:51:26

标签: java multithreading callable

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

4 个答案:

答案 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)

根据我的理解,不能保证Java中线程的启动和停止的优先级。一些线程在启动后可能会转到另一个线程的等待模式,可能是因为它正在等待I / O.

以下是我提出的一些可能有你想要的问题 - 使用循环同时启动线程。

Why is it that threads 10000 start() calls take more time than 10000 run() calls?

答案 3 :(得分:0)

我不知道你的要求是什么。但我可以给你一点路径。你可以为每个线程生成唯一的id,并将那个带有null值字段的id放在(database)somewhere.And生成的线程来更新它们所属的表(id)。之后你可以检查值是否更新并获得价值。