Java Thread.Interrupt()在Android中无法正常工作? 这是我的密码:

Java Thread.Interrupt()在Android中无法正常工作? 这是我的密码:,java,android,multithreading,Java,Android,Multithreading,调用中断确实会停止线程,但仅仅在一瞬间,线程就会立即继续,但为什么呢我目前解决此问题的方法是使用ArrayList管理线程,然后循环ArrayList以停止线程。这虽然管用,但肯定不好。有人能帮我吗 Logcat输出: //////////////////////////////////// called refreshVolumes(true) //////////////////////////////////// 08-0

调用中断确实会停止线程,但仅仅在一瞬间,线程就会立即继续,但为什么呢我目前解决此问题的方法是使用ArrayList管理线程,然后循环ArrayList以停止线程。这虽然管用,但肯定不好。有人能帮我吗



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

当抛出InterruptedException时(由于睡眠时被中断),它清除中断标志。如果希望它以这种方式工作,您应该实际处理
InterruptedException
,并使用
catch
块中断循环。

当抛出
InterruptedException
(由于在睡眠时被中断)时,它会清除中断标志。如果希望它以这种方式工作,您应该实际处理
InterruptedException
并使用
catch
块来中断循环。

我已经尝试过了,但是它仍然不起作用。但是我通过设置
线程==null
并使用null指针异常来中断循环,从而使其工作。@Haomin-omg,no;只是不要忽略
中断异常
。Put
Thread.currentThread().interrupt()在catch块中,这个问题就解决了,正如@VeeArr所建议的那样。@bowmore我首先使用了catch InterruptedException,当然,由于线程处于睡眠状态,它应该生成一个InterruptedException。但是,始终没有到达挡块。这就是为什么我将其更改为“忽略”。同时,我确信我在同一个线程上操作。无论如何,您必须处理InterruptedException。@bowmore对不起,我的错误被捕获了,这次我调用了thread.interrupt(thread是线程的名称),它成功了。谢谢你们两位。我已经试过了,但是它仍然不起作用。但是我通过设置
线程==null
并使用null指针异常来中断循环,从而使其工作。@Haomin-omg,no;只是不要忽略
中断异常
。Put
Thread.currentThread().interrupt()在catch块中,这个问题就解决了,正如@VeeArr所建议的那样。@bowmore我首先使用了catch InterruptedException,当然,由于线程处于睡眠状态,它应该生成一个InterruptedException。但是,始终没有到达挡块。这就是为什么我将其更改为“忽略”。同时,我确信我在同一个线程上操作。无论如何,您必须处理InterruptedException。@bowmore对不起,我的错误被捕获了,这次我调用了thread.interrupt(thread是线程的名称),它成功了。谢谢你们两位。
        ////////////////////////////////////
        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