我一直在使用java线程,我对Thread.interrupt()
行为感到困惑。正如我从this ibm article那里学到的,如果一个线程在调用sleep()
时正在执行一些阻塞方法(如interrupt()
),则会抛出异常并且{{1将要清除标志(设置为interrrupted
)。但是如果没有执行这样的阻塞方法,那么false
标志将是真的,所以我可以在打破无限循环的条件下使用它。
问题在于它实际上并不是这样运作的。当我在要停止的线程上调用interrrupted
时,除了在无限循环中显示日志之外什么都不做(所以没有interrupt()
或sleep()
),循环没有'因为wait()
返回false,所以真的停止了。为什么会这样?这是一些代码示例:
isInterrupted()
即使在致电exoPlayer.addListener(new ExoPlayer.EventListener() {
Thread positionChecker;
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
Log.d("TAG", "onPlayerStateChanged");
if (playbackState == ExoPlayer.STATE_READY) {
if (playWhenReady) {
positionChecker = new Thread() {
@Override
public void run() {
while (!isInterrupted()) {
Log.d("TAG", "isInterrupted = " + isInterrupted());
}
}
};
positionChecker.start();
}
if (!playWhenReady) {
if (positionChecker != null) {
Log.d("TAG", "Interrupting the thread");
positionChecker.interrupt();
}
}
}
}
}
之后, Log.d("TAG", "isInterrupted = " + isInterrupted());
始终会打印“isInterrupted = false”