【问题标题】:Get values from an infinite loop从无限循环中获取值
【发布时间】:2014-03-13 19:26:57
【问题描述】:

我有 5 个线程在无限循环中运行。每次所有 5 个线程结束后,我都需要获取最终值。我该怎么做?

while(true){
        new Class1(1,10).start();
        new Class1(11,20).start();
        new Class1(21,30).start();
        new Class1(31,40).start();
        new Class1(41,50).start();
    }

我需要确定这 5 个线程的结束并选择一个在所有线程中更新的特定值。我该怎么做?

【问题讨论】:

  • 添加一个连接。将值写入数组。
  • @elyashiv 加入?我听说过加入,但还没有尝试过。我会调查一下,让你知道这是否对我有用。你能给我一些简单的同时加入的例子吗?

标签: java multithreading infinite-loop


【解决方案1】:

您的代码将在循环中每次启动 5 个新线程并不断循环。你确定这就是你想要的吗?

只需使用CountDownLatch http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html

将latch初始化为5。每个线程退出时对latch进行一次倒计时。

主线程等待闩锁达到 0,然后进行处理并退出。

不要循环创建线程!

【讨论】:

  • 我知道我的代码每次启动 5 个线程。我正在做一个监控系统,所以我需要那些。我还没有听说过 CountDownLatch。我一定会看看它是否适合我并让你知道。
  • @Parthe 您不会在每次运行时创建 5 个线程。你正在创造数千,甚至数百万。然而,在一切都慢下来之前,while 循环设法创建了许多...
  • 如果我需要持续监控端口,你有什么建议来代替这个。我的意思是从一天开始到一天结束连续检查系统中的开放端口
  • 不会增加运行时间吗?
  • 我将其更改为单线程并在运行正常后运行它。非常感谢。
【解决方案2】:
while(true){
  List<Class1> x = Arrays.asList( new Class1(1,10), new Class1(11,20), new Class1(21,30), new Class1(31,40), Class1(41,50));
  for (Class1 t: x) {
    x.start();
  }
  for (Class1 t: x) {
    x.join();
  }
}

【讨论】:

  • 我不明白你在上面的代码中做了什么。能给我解释一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 2016-11-09
  • 2019-12-17
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2019-11-25
相关资源
最近更新 更多