【问题标题】:How do you collect data from all your threads in java?你如何从java中的所有线程收集数据?
【发布时间】:2019-09-20 02:57:03
【问题描述】:

所以我创建了一个扩展Thread 类的class,并且我有一个调用start() 的主类。 我已经创建了 1000 个线程来以这种方式运行我的程序:

int ThreadNum = 1000;
for(int i=0; i<ThreadNum; i++){
   Thread_Class function = new Thread_Class();// The Thread_Class is the one that extends the Thread class.
function.start();                    }

这会产生 1000 个线程吗?以及如何从所有线程收集数据?

非常感谢!!我都很感激!

【问题讨论】:

  • 是的,您正在创建1000 线程以及您想收集哪些数据?
  • 我让每个线程运行一个函数,该函数将产生一个双精度类型的数字,我想从所有这 1000 个线程中收集它们,并能够使用收集到的数据并做其他事情。

标签: java multithreading java-threads collect


【解决方案1】:

在您的问题中构造线程的方式很好,但是您正在为循环中的每次迭代旋转一个新的Thread,这是一个非常糟糕的主意。

构建一个新线程是一件代价高昂的事情,您必须避免。为了缓解这个问题,创建了ThreadPool,其中包含Threads。

您已成功创建Threads,但它不会返回值。注意 start 方法只负责启动线程。您可以在生成的线程工作时等待/中断它。没有办法返回一个对象。

来自Runnable的文档,

然而,Runnable 不返回结果,也不能抛出 检查异常。

是的,class Thread implements Runnable。您已经创建了 extending Thread 类的对象。所以你的行为是一样的。

如@Ravindra 所回答,替代方法是继续使用Callable

来自Callable的文档

返回结果并可能引发异常的任务。

这正是你所需要的。

PS:另外,请注意future.get() 是一个阻塞调用。并且始终建议将其与超时一起使用。

【讨论】:

  • 没有这样的事情表明 future.get 应该总是被超时调用。如果有,请在文档中显示。
猜你喜欢
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
相关资源
最近更新 更多