小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

中斷線程Interrupt與Interrupted的用處

 dddTTLee 2011-04-13
 
 

★ 線程狀態(tài)

       Java虛擬機(jī)將線程運(yùn)行過(guò)程分成四種狀態(tài) 。 (1) New 新生;(2) Runnable 可運(yùn)行;(3) Blocked 阻塞;(4) Dead 死亡。

      值得注意的是: 線程的可運(yùn)行狀態(tài)并不代表線程一定在運(yùn)行(runnable != running ) 。 大家都知道:所有現(xiàn)代桌面和服務(wù)器操作系統(tǒng)都使用了搶占式的線程調(diào)度策略 。一旦線程開(kāi)始執(zhí)行,并不是總是保持持續(xù)運(yùn)行狀態(tài)的。當(dāng)系統(tǒng)分給它的時(shí)間片(非常小的運(yùn)行時(shí)間單位)用完以后,不管程序有沒(méi)有執(zhí)行完,線程被強(qiáng)制放棄CPU,進(jìn)入就緒狀態(tài),直到下次被調(diào)度后開(kāi)始繼續(xù)執(zhí)行。也就是說(shuō), Runnable可運(yùn)行狀態(tài)的線程處于兩種可能的情況下:(1)占用CPU運(yùn)行中,(2)等待調(diào)度的就緒狀態(tài)。 這里要聲明一下:處于等待調(diào)度的就緒狀態(tài)線程和處于阻塞的線程是完全不同的。就緒的線程是因?yàn)闀r(shí)間片用完而放棄CPU,其隨時(shí)都有可能再次獲得CPU而運(yùn)行,這一切取決于分時(shí)OS的線程調(diào)度策略。

       在很多操作系統(tǒng)的專(zhuān)業(yè)術(shù)語(yǔ)中,這種因時(shí)間片用完而被剝奪CPU的情況我們叫做線程中斷 。注意這和我們下面要將得中斷線程是兩個(gè)完全不同的概念。事實(shí)上,我們不可能通過(guò)應(yīng)用程序來(lái)控制CPU的線程中斷,除非我們能夠自由調(diào)用OS的內(nèi)核。


中斷線程 —— interrupt()

       一個(gè)正在運(yùn)行的線程除了正常的時(shí)間片中斷之外,能否被其他線程控制?或者說(shuō)其他線程能否讓指定線程放棄CPU或者提前結(jié)束運(yùn)行? 除了線程同步機(jī)制之外,還有兩種方法:
       (1) Thread.stop(), Thread.suspend(), Thread.resume() 和Runtime.runFinalizersOnExit() 這些終止線程運(yùn)行的方法 。這些方法已經(jīng)被廢棄,使用它們是極端不安全的。
       (2) Thread.interrupt() 方法是很好的選擇。但是使用的時(shí)候我們必須好好理解一下它的用處。

Java代碼
  1. //無(wú)法中斷正在運(yùn)行的線程代碼     
  2. class TestRunnable implements Runnable{     
  3.       public void run(){     
  4.             while(true)     
  5.             {     
  6.                   System.out.println( "Thread is running..." );     
  7.                   long time = System.currentTimeMillis();//去系統(tǒng)時(shí)間的毫秒數(shù)     
  8.             while((System.currentTimeMillis()-time < 1000)) {     
  9.                    //程序循環(huán)1秒鐘,不同于sleep(1000)會(huì)阻塞進(jìn)程。     
  10.             }     
  11.               }     
  12.        }     
  13. }     
  14. public class ThreadDemo{     
  15.          public static void main(String[] args){     
  16.                Runnable r=new TestRunnable();     
  17.                Thread th1=new Thread(r);     
  18.                th1.start();     
  19.                th1.interrupt();              
  20.         }     
  21. }     
  22. /運(yùn)行結(jié)果:一秒鐘打印一次Thread is running...。程序沒(méi)有終止的任何跡象   

      上面的代碼說(shuō)明interrupt()并沒(méi)有中斷一個(gè)正在運(yùn)行的線程,或者說(shuō)讓一個(gè)running中的線程放棄CPU。那么interrupt到底中斷什么。

       首先我們看看interrupt究竟在干什么。

       當(dāng)我們調(diào)用th1.interrput()的時(shí)候,線程th1的中斷狀態(tài)(interrupted status) 會(huì)被置位。我們可以通過(guò)Thread.currentThread().isInterrupted() 來(lái)檢查這個(gè)布爾型的中斷狀態(tài)。

        在Core Java中有這樣一句話(huà):"沒(méi)有任何語(yǔ)言方面的需求要求一個(gè)被中斷的程序應(yīng)該終止。中斷一個(gè)線程只是為了引起該線程的注意,被中斷線程可以決定如何應(yīng)對(duì)中斷 "。好好體會(huì)這句話(huà)的含義,看看下面的代碼:

Java代碼 復(fù)制代碼 收藏代碼
  1. //Interrupted的經(jīng)典使用代碼     
  2. public void run(){     
  3.         try{     
  4.              ....     
  5.              while(!Thread.currentThread().isInterrupted()&& more work to do){     
  6.                     // do more work;     
  7.              }     
  8.         }catch(InterruptedException e){     
  9.                     // thread was interrupted during sleep or wait     
  10.         }     
  11.         finally{     
  12.                    // cleanup, if required     
  13.         }     
  14. }    

       很顯然,在上面代碼中,while循環(huán)有一個(gè)決定因素就是需要不停的檢查自己的中斷狀態(tài)。當(dāng)外部線程調(diào)用該線程的interrupt 時(shí),使得中斷狀態(tài)置位。這是該線程將終止循環(huán),不在執(zhí)行循環(huán)中的do more work了。

       這說(shuō)明: interrupt中斷的是線程的某一部分業(yè)務(wù)邏輯,前提是線程需要檢查自己的中斷狀態(tài)(isInterrupted())。

       但是當(dāng)th1被阻塞的時(shí)候,比如被Object.wait, Thread.join和Thread.sleep三種方法之一阻塞時(shí)。調(diào)用它的interrput()方法??上攵瑳](méi)有占用CPU運(yùn)行的線程是不可能給自己的中斷狀態(tài)置位的。這就會(huì)產(chǎn)生一個(gè)InterruptedException異常。

Java代碼 復(fù)制代碼 收藏代碼
  1.  //中斷一個(gè)被阻塞的線程代碼   
  2. class TestRunnable implements Runnable{   
  3.      public void run(){   
  4.           try{   
  5.         Thread.sleep(1000000); //這個(gè)線程將被阻塞1000秒   
  6.        }catch(InterruptedException e){   
  7.          e.printStackTrace();   
  8.                      //do more work and return.   
  9.           }   
  10.      }   
  11. }   
  12. public class TestDemo2{   
  13.       public static void main(String[] args) {   
  14.             Runnable tr=new TestRunnable();   
  15.             Thread th1=new Thread(tr);   
  16.             th1.start(); //開(kāi)始執(zhí)行分線程   
  17.         while(true){   
  18.        th1.interrupt();  //中斷這個(gè)分線程   
  19.         }   
  20.       }   
  21. }   
  22. /*運(yùn)行結(jié)果:  
  23.    java.lang.InterruptedException: sleep interrupted  
  24.         at java.lang.Thread.sleep(Native Method)  
  25.         at TestRunnable.run(TestDemo2.java:4)  
  26.         at java.lang.Thread.run(Unknown Source)*/  
 
 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多