1. 程式人生 > >中斷含有死迴圈和sleep的子執行緒(java.lang.InterruptedException: sleep interrupted)

中斷含有死迴圈和sleep的子執行緒(java.lang.InterruptedException: sleep interrupted)

【轉載】:https://blog.csdn.net/qq_33291307/article/details/78804781

死迴圈執行緒中包含sleep,無法中斷執行緒:在sleep前面新增Thread.current.isInterrupt判斷,跳出死迴圈,因為sleep本身是丟擲一個interrupt異常。我覺得轉載的比較容易理解,注意sleep的位置和if()語句的位置。(忽略我可能寫錯的方法名)。

java 高併發

問題描述:當前 if 判斷的中斷`如果在sleep ,就算外面中斷,裡面也會有序的退出,

但是當if 判斷在sleep 後面的時候,他就會出想中斷異常 (時間不夠造成的 main 也是一個執行緒)

package com.example.echo.Lock;

/**
 * Thread寫在哪裡,當對當前的程序影響
 */

/**
 *
 */
class Interrupted_root_make extends Thread{

    @Override
    public void run() {
        while (true) {
            System.out.println("-----");


            /**
             * 使用中斷命令,外部只是其的一個通知命令,實際上的中斷的操作還是需要內部自己判斷操作,退出
*/ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if ( Thread.currentThread().isInterrupted() ) { System.out.println("i has interputed"); break;
} Thread.yield(); } } } public class Interruped_test { public static void main(String[] args) throws InterruptedException { Interrupted_root_make interrupted_root_make = new Interrupted_root_make(); interrupted_root_make.start(); interrupted_root_make.interrupt(); } }

正確的

class Interrupted_root_make extends Thread{

    @Override
    public void run() {
        while (true) {

            if ( Thread.currentThread().isInterrupted() ) {
                System.out.println("i has interputed");
                break;
            }
            System.out.println("-----");


            /**
             * 使用中斷命令,外部只是其的一個通知命令,實際上的中斷的操作還是需要內部自己判斷操作,退出
             */
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }



            Thread.yield();
        }
    }
}
public class Interruped_test {
    public static void main(String[] args) throws InterruptedException {
        Interrupted_root_make interrupted_root_make = new Interrupted_root_make();
        interrupted_root_make.start();
        Thread.sleep(1000);
        interrupted_root_make.interrupt();




    }
}