Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使没有阻塞方法,Java Thread.isInterrupted()也返回false_Java_Android_Concurrency_Interrupt - Fatal编程技术网

即使没有阻塞方法,Java Thread.isInterrupted()也返回false

即使没有阻塞方法,Java Thread.isInterrupted()也返回false,java,android,concurrency,interrupt,Java,Android,Concurrency,Interrupt,我一直在使用java线程,我对Thread.interrupt()行为感到困惑。正如我从中了解到的,如果一个线程在调用interrupt()时正在执行某种阻塞方法(如sleep()),将抛出一个异常,并清除interrupted标志(设置为false)。但是如果没有执行这样的阻塞方法,那么interrupted标志将为true,因此我可以在打破无止境循环的情况下使用它 问题是它实际上不是这样工作的。当我在我想要停止的线程上调用interrupt(),该线程除了在一个无休止的循环中显示日志之外什么

我一直在使用java线程,我对
Thread.interrupt()
行为感到困惑。正如我从中了解到的,如果一个线程在调用
interrupt()
时正在执行某种阻塞方法(如
sleep()
),将抛出一个异常,并清除
interrupted
标志(设置为
false
)。但是如果没有执行这样的阻塞方法,那么
interrupted
标志将为true,因此我可以在打破无止境循环的情况下使用它

问题是它实际上不是这样工作的。当我在我想要停止的线程上调用
interrupt()
,该线程除了在一个无休止的循环中显示日志之外什么都不做(因此没有
sleep()
wait()
),循环不会真正停止,因为
isInterrupted()
返回false。为什么会这样?下面是一些代码示例:

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(“标记”、“isInterrupted=“+isInterrupted())始终打印“isInterrupted=false”,即使在调用
positionChecker.interrupt()之后也是如此

假设它已更改为true。。。因此,线程退出循环,日志语句不被调用……在调用
positionChecker.interrupt()
之后,它永远不会更改为true。我仍然可以看到日志打印“isInterrupted=false”