亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

停止Java線程,小心interrupt()方法

2019-11-06 06:59:39
字體:
來源:轉載
供稿:網友

轉自http://blog.csdn.net/wxwzy738/article/details/8516253

程序是很簡易的。然而,在編程人員面前,多線程呈現出了一組新的難題,如果沒有被恰當的解決,將導致意外的行為以及細微的、難以發現的錯誤?! ≡诒酒恼轮?,我們針對這些難題之一:如何中斷一個正在運行的線程。 

背景     中斷(Interrupt)一個線程意味著在該線程完成任務之前停止其正在進行的一切,有效地中止其當前的操作。線程是死亡、還是等待新的任務或是繼續運行至下一步,就取決于這個程序。雖然初次看來它可能顯得簡單,但是,你必須進行一些預警以實現期望的結果。你最好還是牢記以下的幾點告誡。     首先,忘掉Thread.stop方法。雖然它確實停止了一個正在運行的線程,然而,這種方法是不安全也是不受提倡的,這意味著,在未來的java版本中,它將不復存在。     一些輕率的家伙可能被另一種方法Thread.interrupt所迷惑。盡管,其名稱似乎在暗示著什么,然而,這種方法并不會中斷一個正在運行的線程(待會將進一步說明),正如Listing A中描述的那樣。它創建了一個線程,并且試圖使用Thread.interrupt方法停止該線程。Thread.sleep()方法的調用,為線程的初始化和中止提供了充裕的時間。線程本身并不參與任何有用的操作。 Listing A 

[java] view plain copyclass Example1 extends Thread {              boolean stop=false;              public static void main( String args[] ) throws Exception {              Example1 thread = new Example1();              System.out.PRintln( "Starting thread..." );              thread.start();              Thread.sleep( 3000 );             System.out.println( "Interrupting thread..." );              thread.interrupt();              Thread.sleep( 3000 );              System.out.println("Stopping application..." );              //System.exit(0);              }              public void run() {              while(!stop){              System.out.println( "Thread is running..." );              long time = System.currentTimeMillis();              while((System.currentTimeMillis()-time < 1000)) {              }              }              System.out.println("Thread exiting under request..." );              }  }  如果你運行了Listing A中的代碼,你將在控制臺看到以下輸出: Starting thread... Thread is running... Thread is running... Thread is running... Interrupting thread... Thread is running... Thread is running... Thread is running... Stopping application... Thread is running... Thread is running... Thread is running... ............................... 甚至,在Thread.interrupt()被調用后,線程仍然繼續運行。 真正地中斷一個線程     中斷線程最好的,最受推薦的方式是,使用共享變量(shared variable)發出信號,告訴線程必須停止正在運行的任務。線程必須周期性的核查這一變量(尤其在冗余操作期間),然后有秩序地中止任務。Listing B描述了這一方式。 Listing B [java] view plain copyclass Example2 extends Thread {  volatile boolean stop = false;  public static void main( String args[] ) throws Exception {  Example2 thread = new Example2();     System.out.println( "Starting thread..." );     thread.start();     Thread.sleep( 3000 );     System.out.println( "Asking thread to stop..." );     thread.stop = true;     Thread.sleep( 3000 );     System.out.println( "Stopping application..." );     //System.exit( 0 );    }      public void run() {      while ( !stop ) {       System.out.println( "Thread is running..." );        long time = System.currentTimeMillis();        while ( (System.currentTimeMillis()-time < 1000) && (!stop) ) {        }      }     System.out.println( "Thread exiting under request..." );    }  }  運行Listing B中的代碼將產生如下輸出(注意線程是如何有秩序的退出的) Starting thread... Thread is running... Thread is running... Thread is running... Asking thread to stop... Thread exiting under request... Stopping application...    雖然該方法要求一些編碼,但并不難實現。同時,它給予線程機會進行必要的清理工作,這在任何一個多線程應用程序中都是絕對需要的。請確認將共享變量定義成volatile 類型或將對它的一切訪問封入同步的塊/方法(synchronized blocks/methods)中。 到目前為止一切順利!但是,當線程等待某些事件發生而被阻塞,又會發生什么?當然,如果線程被阻塞,它便不能核查共享變量,也就不能停止。這在許多情況下會發生,例如調用Object.wait()、ServerSocket.accept()和DatagramSocket.receive()時,這里僅舉出一些。 他們都可能永久的阻塞線程。即使發生超時,在超時期滿之前持續等待也是不可行和不適當的,所以,要使用某種機制使得線程更早地退出被阻塞的狀態。 很不幸運,不存在這樣一種機制對所有的情況都適用,但是,根據情況不同卻可以使用特定的技術。在下面的環節,我將解答一下最普遍的例子。 使用Thread.interrupt()中斷線程   正如Listing A中所描述的,Thread.interrupt()方法不會中斷一個正在運行的線程。這一方法實際上完成的是,在線程受到阻塞時拋出一個中斷信號,這樣線程就得以退出阻塞的狀態。更確切的說,如果線程被Object.wait, Thread.join和Thread.sleep三種方法之一阻塞,那么,它將接收到一個中斷異常(InterruptedException),從而提早地終結被阻塞狀態。     因此,如果線程被上述幾種方法阻塞,正確的停止線程方式是設置共享變量,并調用interrupt()(注意變量應該先設置)。如果線程沒有被阻塞,這時調用interrupt()將不起作用;否則,線程就將得到異常(該線程必須事先預備好處理此狀況),接著逃離阻塞狀態。在任何一種情況中,最后線程都將檢查共享變量然后再停止。Listing C這個示例描述了該技術。 Listing C 

[java] view plain copyclass Example3 extends Thread {    volatile boolean stop = false;    public static void main( String args[] ) throws Exception {     Example3 thread = new Example3();     System.out.println( "Starting thread..." );     thread.start();     Thread.sleep( 3000 );     System.out.println( "Asking thread to stop..." );     thread.stop = true;//如果線程阻塞,將不會檢查此變量     thread.interrupt();     Thread.sleep( 3000 );     System.out.println( "Stopping application..." );     //System.exit( 0 );    }      public void run() {      while ( !stop ) {       System.out.println( "Thread running..." );        try {        Thread.sleep( 1000 );        } catch ( InterruptedException e ) {        System.out.println( "Thread interrupted..." );        }      }     System.out.println( "Thread exiting under request..." );    }  }  一旦Listing C中的Thread.interrupt()被調用,線程便收到一個異常,于是逃離了阻塞狀態并確定應該停止。運行以上代碼將得到下面的輸出: Starting thread... Thread running... Thread running... Thread running... Asking thread to stop... Thread interrupted... Thread exiting under request... Stopping application... 中斷I/O操作     然而,如果線程在I/O操作進行時被阻塞,又會如何?I/O操作可以阻塞線程一段相當長的時間,特別是牽扯到網絡應用時。例如,服務器可能需要等待一個請求(request),又或者,一個網絡應用程序可能要等待遠端主機的響應。 如果你正使用通道(channels)(這是在Java 1.4中引入的新的I/O API),那么被阻塞的線程將收到一個ClosedByInterruptException異常。如果情況是這樣,其代碼的邏輯和第三個例子中的是一樣的,只是異常不同而已。 但是,你可能正使用Java1.0之前就存在的傳統的I/O,而且要求更多的工作。既然這樣,Thread.interrupt()將不起作用,因為線程將不會退出被阻塞狀態。Listing D描述了這一行為。盡管interrupt()被調用,線程也不會退出被阻塞狀態 Listing D 

[java] view plain copyimport java.io.*;  class Example4 extends Thread {    public static void main( String args[] ) throws Exception {      Example4 thread = new Example4();     System.out.println( "Starting thread..." );     thread.start();     Thread.sleep( 3000 );     System.out.println( "Interrupting thread..." );     thread.interrupt();     Thread.sleep( 3000 );     System.out.println( "Stopping application..." );     //System.exit( 0 );    }      public void run() {     ServerSocket socket;      try {        socket = new ServerSocket(7856);      } catch ( IOException e ) {       System.out.println( "Could not create the socket..." );        return;      }      while ( true ) {       System.out.println( "Waiting for connection..." );        try {         Socket sock = socket.accept();        } catch ( IOException e ) {        System.out.println( "accept() failed or interrupted..." );        }      }    }  }   很幸運,Java平臺為這種情形提供了一項解決方案,即調用阻塞該線程的套接字的close()方法。在這種情形下,如果線程被I/O操作阻塞,該線程將接收到一個SocketException異常,這與使用interrupt()方法引起一個InterruptedException異常被拋出非常相似。 唯一要說明的是,必須存在socket的引用(reference),只有這樣close()方法才能被調用。這意味著socket對象必須被共享。Listing E描述了這一情形。運行邏輯和以前的示例是相同的。 Listing E 

[java] view plain copyimport java.net.*;  import java.io.*;  class Example5 extends Thread {    volatile boolean stop = false;    volatile ServerSocket socket;    public static void main( String args[] ) throws Exception {      Example5 thread = new Example5();     System.out.println( "Starting thread..." );     thread.start();     Thread.sleep( 3000 );     System.out.println( "Asking thread to stop..." );     thread.stop = true;     thread.socket.close();     Thread.sleep( 3000 );     System.out.println( "Stopping application..." );     //System.exit( 0 );    }    public void run() {      try {        socket = new ServerSocket(7856);      } catch ( IOException e ) {        System.out.println( "Could not create the socket..." );        return;      }      while ( !stop ) {        System.out.println( "Waiting for connection..." );        try {          Socket sock = socket.accept();        } catch ( IOException e ) {          System.out.println( "accept() failed or interrupted..." );        }      }      System.out.println( "Thread exiting under request..." );    }  }  以下是運行Listing E中代碼后的輸出: Starting thread... Waiting for connection... Asking thread to stop... accept() failed or interrupted... Thread exiting under request... Stopping application... 多線程是一個強大的工具,然而它正呈現出一系列難題。其中之一是如何中斷一個正在運行的線程。如果恰當地實現,使用上述技術中斷線程將比使用Java平臺上已經提供的內嵌操作更為簡單。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av在线免费观看一区| 91成人天堂久久成人| 亚洲第一视频在线观看| 亚洲欧美综合区自拍另类| 91国内精品久久| 久久精品影视伊人网| 国产日韩欧美自拍| 黄色一区二区三区| 亚洲精品中文字幕有码专区| 91网站免费观看| 中文字幕精品www乱入免费视频| 久久久亚洲精选| 中文字幕亚洲欧美日韩2019| 久久久久久亚洲| 亚洲激情久久久| 91精品国产777在线观看| 日韩电影在线观看中文字幕| 久久久久国产一区二区三区| 国产欧美精品日韩精品| 亚洲国产美女久久久久| 欧美日韩国产色| 日韩精品视频免费专区在线播放| 久久久久久18| 国产精品久久国产精品99gif| 久久久久国产精品免费网站| 77777少妇光屁股久久一区| 91视频国产一区| 色婷婷亚洲mv天堂mv在影片| 欧美成人精品在线观看| 黄色成人av在线| 亚洲国产另类 国产精品国产免费| 亚洲国产中文字幕久久网| 亚洲天堂男人的天堂| 亚洲japanese制服美女| 亚洲综合中文字幕在线观看| 亚洲综合中文字幕在线观看| 成人疯狂猛交xxx| 日韩欧美国产黄色| 久久国产精品久久国产精品| 日韩有码片在线观看| 亚洲欧美成人网| 亚洲精品www久久久| 黄色成人av在线| 精品中文字幕在线| 91av在线免费观看| 久久久av免费| 久久精品国产成人| 国产suv精品一区二区三区88区| 国产一区二区三区久久精品| 成人在线精品视频| 91免费综合在线| 国产精品嫩草影院一区二区| 欧美精品videos另类日本| 午夜欧美不卡精品aaaaa| 日韩av免费看网站| 91精品国产高清久久久久久| 狠狠色狠狠色综合日日小说| 亚洲精品久久久久国产| 精品香蕉在线观看视频一| 国产v综合ⅴ日韩v欧美大片| 亚洲国产成人久久| 97免费在线视频| 欧美与欧洲交xxxx免费观看| 日韩成人在线网站| 成人免费看吃奶视频网站| 国产成人中文字幕| 欧美日韩午夜剧场| xxxx性欧美| 亚洲欧美一区二区三区久久| 日韩中文字幕视频在线观看| 亚洲a在线观看| 久久久av免费| 亚洲国产精品字幕| 中文字幕亚洲一区| 久久不射热爱视频精品| 国产精品久久久久99| 欧美视频裸体精品| 亚洲欧美国产va在线影院| 26uuu亚洲伊人春色| 国产精品视频一区国模私拍| 97精品一区二区视频在线观看| 亚洲码在线观看| 91色中文字幕| 国产精品国产自产拍高清av水多| 国产精品在线看| 欧美国产一区二区三区| 欧美激情图片区| 俺去亚洲欧洲欧美日韩| 中文字幕日韩欧美在线| 日韩av理论片| 精品欧美一区二区三区| 日韩成人在线免费观看| 亚洲国产欧美一区二区三区久久| 精品综合久久久久久97| 欧洲中文字幕国产精品| 亚洲一区二区中文| 亚洲国产欧美在线成人app| 欧美激情欧美激情在线五月| 国产精品一区二区三区成人| 亚洲综合日韩中文字幕v在线| 亚洲国产精品久久久久秋霞蜜臀| 91精品视频播放| 91久久久久久国产精品| 美女精品久久久| 亚洲精品国产精品久久清纯直播| 国产精品一区二区三区免费视频| 成人网在线免费观看| 日韩精品欧美国产精品忘忧草| 国产精品自拍视频| 一区二区亚洲欧洲国产日韩| 欧美最猛性xxxxx免费| 精品五月天久久| www国产亚洲精品久久网站| 亚洲人午夜色婷婷| 亚洲视频网站在线观看| 欧美激情a∨在线视频播放| 丝袜情趣国产精品| 亚洲精品久久久久久久久| 精品久久久免费| 国产精品普通话| 欧美激情欧美狂野欧美精品| 国产精品三级网站| 久久99国产精品自在自在app| 欧美二区乱c黑人| 欧洲亚洲免费视频| 国产精品入口日韩视频大尺度| 亚洲第五色综合网| 国产91对白在线播放| 国产成人欧美在线观看| 欧美丰满老妇厨房牲生活| 97欧美精品一区二区三区| 国产成人91久久精品| 在线性视频日韩欧美| 亚洲电影免费观看高清完整版| 日韩欧美在线中文字幕| 国产精品va在线播放我和闺蜜| 亚洲欧美中文日韩v在线观看| 亚洲国产精品成人精品| 欧美精品中文字幕一区| 日产精品久久久一区二区福利| 亚洲a在线观看| 97精品伊人久久久大香线蕉| 亚洲xxx视频| 亚洲天堂久久av| 成人黄色大片在线免费观看| 国产成人一区二区| 欧美成人精品h版在线观看| 91av网站在线播放| 欧美精品久久久久久久| 欧美高清激情视频| 国产综合视频在线观看| 日韩在线观看免费全| 大伊人狠狠躁夜夜躁av一区| 亚洲美女精品成人在线视频| 国产日韩一区在线| 国产精品a久久久久久| 久久久国产影院| 色综合导航网站| 欧美第一黄网免费网站| 亚洲欧美激情一区| 国产精品视频在线观看| 成人春色激情网| 久久色在线播放| 色综合天天狠天天透天天伊人|