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