java - Thread.Interrupt() 在 Android 中没有按预期工作?

标签 java android multithreading

这是我的代码:

调用中断确实会停止线程,但只是一瞬间,线程立即继续,但为什么呢? 我目前解决这个问题的方法是使用ArrayList来管理线程,并循环遍历ArrayList来停止线程。虽然这有效,但肯定不好。谁能帮我解决这个问题吗?

<小时/>
private Thread thread;
private static final String TAG = "StoragePresenter";

public void refreshVolumes(boolean isRunning) {
    if (isRunning) {
        Handler handler = new Handler();
        Runnable runnable = () -> {
            while (!thread.isInterrupted()) {
                Log.d(TAG, "refreshVolumes: thread.isInterrupted? above while " + thread.isInterrupted());
                try {
                    Thread.sleep(refreshDelay);
                    Log.d(TAG, "refreshVolumes: in TRY ---> " + Thread.currentThread().getName()); //Thread -> 9
                } catch (InterruptedException ignored) {
                }
                Log.d(TAG, "refreshVolumes: in runnable WHILE ---> " + Thread.currentThread().getName());
                handler.post(this::getVolumes);
            }
        };
        thread = new Thread(runnable);
        Log.d(TAG, "refreshVolumes: start thread's name -> " + thread.getName());
        thread.start(); // Thread -> 9 started
    } else {
        Log.d(TAG, "refreshVolumes: interrupt thread's name -> " + thread.getName());
        thread.interrupt(); // Thread -> 9 interrupted
        Log.d(TAG, "refreshVolumes: thread.isInterrupted? " + thread.isInterrupted());
        Log.d(TAG, "refreshVolumes: thread.isInterrupted? 2x " + thread.isInterrupted());
    }
}
<小时/>

Logcat 输出:

        ////////////////////////////////////
        called refreshVolumes(true)
        ////////////////////////////////////
        08-09 17:41:29.687 924-1811/? I/ActivityManager: START u0 {cmp=com.xxxxxxxxx.android.dev/com.xxxxxxxxx.app.ui.main.settings.storage.StorageActivity} from uid 10293
        08-09 17:41:29.767 26451-26451/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: start thread's name -> Thread-9
        08-09 17:41:29.768 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: thread.isInterrupted? above while false
        08-09 17:41:29.927 924-995/? I/ActivityManager: Displayed com.xxxxxxxxx.android.dev/com.xxxxxxxxx.app.ui.main.settings.storage.StorageActivity: +210ms
        08-09 17:41:33.269 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in TRY ---> Thread-9
            refreshVolumes: in runnable WHILE ---> Thread-9
        08-09 17:41:33.271 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: thread.isInterrupted? above while false
        08-09 17:41:36.772 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in TRY ---> Thread-9
            refreshVolumes: in runnable WHILE ---> Thread-9
        08-09 17:41:36.773 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: thread.isInterrupted? above while false
        08-09 17:41:40.274 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in TRY ---> Thread-9
            refreshVolumes: in runnable WHILE ---> Thread-9
        08-09 17:41:40.275 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: thread.isInterrupted? above while false
        08-09 17:41:43.776 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in TRY ---> Thread-9
            refreshVolumes: in runnable WHILE ---> Thread-9
        08-09 17:41:43.777 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: thread.isInterrupted? above while false
        08-09 17:41:47.278 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in TRY ---> Thread-9
        08-09 17:41:47.279 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in runnable WHILE ---> Thread-9
        08-09 17:41:47.280 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: thread.isInterrupted? above while false
        08-09 17:41:50.780 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in TRY ---> Thread-9
            refreshVolumes: in runnable WHILE ---> Thread-9
            refreshVolumes: thread.isInterrupted? above while false
        ////////////////////////////////////
        called refreshVolumes(false)
        ////////////////////////////////////
        08-09 17:41:50.861 26451-26451/com.xxxxxxxxx.android.dev
D/StoragePresenter: refreshVolumes: interrupt thread's name -> Thread-9
        08-09 17:41:50.862 26451-26451/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: thread.isInterrupted? true
            refreshVolumes: thread.isInterrupted? 2x false
        08-09 17:41:50.862 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in runnable WHILE ---> Thread-9
            refreshVolumes: thread.isInterrupted? above while false
        08-09 17:41:54.362 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in TRY ---> Thread-9
        08-09 17:41:54.363 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in runnable WHILE ---> Thread-9
        08-09 17:41:54.376 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: thread.isInterrupted? above while false
        08-09 17:41:57.878 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in TRY ---> Thread-9
            refreshVolumes: in runnable WHILE ---> Thread-9
        08-09 17:41:57.879 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: thread.isInterrupted? above while false
        08-09 17:42:01.380 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in TRY ---> Thread-9
            refreshVolumes: in runnable WHILE ---> Thread-9
        08-09 17:42:01.381 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: thread.isInterrupted? above while false
        08-09 17:42:04.882 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in TRY ---> Thread-9
            refreshVolumes: in runnable WHILE ---> Thread-9
        08-09 17:42:04.883 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: thread.isInterrupted? above while false
        08-09 17:42:08.384 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in TRY ---> Thread-9
        08-09 17:42:08.385 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in runnable WHILE ---> Thread-9
            refreshVolumes: thread.isInterrupted? above while false
        08-09 17:42:11.886 26451-26676/com.xxxxxxxxx.android.dev D/StoragePresenter: refreshVolumes: in TRY ---> Thread-9

最佳答案

何时 Thread.sleep抛出InterruptedException(由于在 sleep 时被中断),它清除中断标志。如果您希望它以这种方式工作,您实际上应该处理 InterruptedException 并使用 catch block 来跳出循环。

关于java - Thread.Interrupt() 在 Android 中没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51776693/

相关文章:

java - java源文件的编码

android - 如何为 ExpandableListView 设置组分隔线颜色

python - 有没有办法在 Windows 上使用 32 位 python 2.7 从线程中打开 64 位 exe?

java - 如何在以谷歌地图为背景的Android上创建 float 搜索 View ?

java - 有没有一种方法可以用java递归地检查字符串是否至少包含一个大写字母?

android - openRawResourceFd 在安卓上失败

wpf - 如何在单独的线程上创建和显示 WPF 窗口?

java - JVM 性能在随机时间后下降

java - 以 Java8 声明式方式填充 Arraylist,而不是迭代地执行

java - 删除值后重置微调器