java.lang.InterruptedException: sleep interrupted
阿新 • • 發佈:2019-02-13
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(); } }