【问题标题】:Thread being called multiple times线程被多次调用
【发布时间】:2017-04-08 21:39:44
【问题描述】:

我有一个处理多个线程的代码。 一个线程等待它所依赖的其他一些线程的执行。

我的线程运行代码如下所示

    public void run() {

    for ( final String name : nameList ) {
      final Thread thread = getThreadByName( name );
      if ( thread != null ) {
          while ( thread.isAlive() ) {
              thread.join();
          }
      }
    }
    //perform action
}

如图所示,通过调用 join() 以类似 run() 的相同方法等待该线程完成执行的线程很少。

假设这个线程依赖于其他三个线程,它正在等待它们在 thread.join() 中完成执行。即 nameList 大小为 3 但该线程也执行 3 次操作。在 for 循环之外。

我用另一种方法启动这个线程,比如

    switch ( element.getKey() ) {
        case A
           thread = new Thread( action );
           thread.setName( threadName );
           thread.start();
         break;

由于某种原因(我无法弄清楚)线程运行了 3 次。

它只在我调用 thread.start() 方法时运行,还是在其他线程在 thread.join() 方法中等待这个线程时它必须做一些事情?当这个线程在 thread.join() 中等待时,它不应该执行进一步的操作,对吧?

更新:

对不起,不清楚的问题: 在run()之后有一个打印语句

运行() //打印一个 For循环

然后在 //perform action 中有另一个 print 语句 //打印B

A 和 B 都打印 3 次。 我唯一想到的数字 3 是因为 nameList 的大小是 3。

【问题讨论】:

  • 如果您没有尽快获得帮助,请考虑创建并发布sscceminimal example program/mcve,在其中将您的代码压缩为仍可编译和运行的最小位,没有外部依赖项(例如需要链接到数据库或图像),没有与您的问题无关的额外代码,但仍能演示您的问题。
  • 问题不清楚。你声称线程的run方法被执行了3次吗?你有什么证据证明这一点?您是否在 run 方法的开头添加了一条打印语句并看到它的输出 3 次?
  • 根本不需要isAlive检查。如果线程死了,join 会立即返回。如果不是这样,您将永远在join 内等待。
  • 顺便说一句,使用Semaphores、CountDownLatches 和CyclicBarriers 可以更轻松地解决这些问题。如果您有一个复杂的互锁线程系统,最好首先检查您是否真的需要那么多线程。
  • 我必须检查其他线程是否仍在运行,然后该线程应该继续等待。我是否需要在 (thread.isAlive()) 或是否 (thread !=null){thread.join()} 达到目的时进行检查?

标签: java multithreading


【解决方案1】:

猜测:你把支票放了

if ( thread != null ) {
  while ( thread.isAlive() ) {
    thread.join();
  }
}

进入你的代码;可能是有原因的。如果该调用实际上返回 null,则跳出 for 循环;然后您将运行以下操作。

所以,万一检查真的有意义;当线程为 null 时,您必须防止离开该循环级别。

【讨论】:

  • 我不明白这个问题,如果thread为空,那么name就没有什么可等的了,这个循环毕竟没有意义。
  • 这取决于他没有显示的代码。外面很可能还有另一个循环……只是在黑暗中短路;有时他们会帮助并被接受;有时他们不会;然后他们被删除。
  • 是的,我更关心switchgetThreadByName方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 2010-10-24
  • 2011-10-18
  • 2020-10-19
相关资源
最近更新 更多