Java中的Interrupt使用


初心

用interrupt中斷程序

初步實現

public class InterruptionInJava implements Runnable{
    @Override
    public void run() {
        while (true) {
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Yes!!  I'm Interupted,  but I'm still running");
            } else {

            }
        }
//        System.out.println("Oh, myGod!");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new InterruptionInJava(), "testThread");
        thread.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {

        }
        System.out.println("Begin Interupt...");
        thread.interrupt();
        System.out.println("End Interupt...");
    }
}

輸出

Yes!!  I'm Interupted,  but I'm still running
Yes!!  I'm Interupted,  but I'm still running
Yes!!  I'm Interupted,  but I'm still running
Yes!!  I'm Interupted,  but I'm still running
Yes!!  I'm Interupted,  but I'm still running
Yes!!  I'm Interupted,  but I'm still running
Yes!!  I'm Interupted,  but I'm still running
.....  

問題:雖然是被中斷狀態,但實際並未中斷

interrupt說明

在java中主要有3個相關方法,interrupt(),isInterrupted()和interrupted()。

  • interrupt(),在一個線程中調用另一個線程的interrupt()方法,即會向那個線程發出信號——線程中斷狀態已被設置。至於那個線程何去何從,由具體的代碼實現決定。
  • isInterrupted(),用來判斷當前線程的中斷狀態(true or false)。
  • interrupted()是個Thread的static方法,用來恢復中斷狀態(!!!

解決不中斷問題

處於被中斷狀態時,return 或 bread 中斷線程

public class InterruptionInJava implements Runnable{
    @Override
    public void run() {
        while (true) {
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("Yes!!  I'm Interupted,  but I'm still running");
                return;
            } else {

            }
        }
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new InterruptionInJava(), "testThread");
        thread.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {

        }
        System.out.println("Begin Interupt...");
        thread.interrupt();
        System.out.println("End Interupt...");
    }
}
View Code

等價開關

public class InterruptionInJava2 implements Runnable{
    private volatile static boolean on = false;

    @Override
    public void run() {
        while (!on) {
            try {
                System.out.println("begin Sleep");
                Thread.sleep(10000000);
                System.out.println("end Sleep");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Oh, myGod!");
        }
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new InterruptionInJava2(), "testThread");
        thread.start();
        try {
            System.out.println("main Begin sleep");
            Thread.sleep(5000);
            System.out.println("main End sleep");
        } catch (InterruptedException e) {

        }
        InterruptionInJava2.on = true;
    }
}

使用靜態變量on

但是在run方法中Thread.sleep(10000000),😱何時結束?

開關中斷解決方案

public class InterruptionInJava2 implements Runnable{
    private volatile static boolean on = false;

    @Override
    public void run() {
        while (!on) {
            try {
                System.out.println("begin Sleep");
                Thread.sleep(10000000);
                System.out.println("end Sleep");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Oh, myGod!");
        }
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new InterruptionInJava2(), "testThread");
        thread.start();
        try {
            System.out.println("main Begin sleep");
            Thread.sleep(5000);
            System.out.println("main End sleep");
        } catch (InterruptedException e) {

        }
        InterruptionInJava2.on = true;
        System.out.println("Begin Interupt...");
        thread.interrupt();
        System.out.println("End Interupt...");
    }
}

輸出

begin Sleep
main Begin sleep
main End sleep
Begin Interupt...
End Interupt...
java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at com.jihite.templet.JavaBase.InterruptionInJava2.run(InterruptionInJava2.java:11)
	at java.lang.Thread.run(Thread.java:748)
Oh, myGod!

Process finished with exit code 0

參考

https://www.cnblogs.com/jenkov/p/juc_interrupt.html  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM