<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    中文JAVA技術平等自由協作創造

    Java專題文章博客和開源

    常用鏈接

    統計

    最新評論

    Java 基本功之中斷線程的理解

      設想這樣的情景:我們的應用在某一個時間段內,需要一個子線程不停的在后臺運行,這可能是一個下載過程,是一個對服務端socket的監聽,也可能是一個繪圖的計算過程。當我們想要終止線程的時候,我們會怎樣做呢?是設定一個標志變量來控制跳出循環?還是使用thread.stop()?又或者是設置thread = null?
       有的時候我們需要一種規范的思路,使用規范的方法來解決一類問題。
       我們首先要明白,線程終止的條件,有三種情況:
       1.當線程的run方法執行方法體中最后一條語句后。
       2.當執行retutrn語句返回時。
       3.當出現了在方法中沒有捕獲的異常時。
       在Java的早期版本中,還有一個stop方法,其他線程可以調用它終止線程,但是這個方法已經被棄用了,所以還在用的同學就不要繼續用了。
       我們的正確思路是,使用interrupt方法來終止我們的線程www.sats686.com
       首先要理解interrupt方法做了什么:每一個線程都有一個中斷狀態,這是一個boolean標志,當線程調用了interrupt方法時,這個中斷狀態就會被置位。如果我們要檢查中斷狀態,可以使用Thread.currentThread()。isInterrupted()來獲得是否中斷。
       但是如果線程被阻塞了(sleep or wait),當我們調用了interrupt方法的時候,就會產生InterruptedException異常。這是我們可以利用的地方。
       同樣的,如果中斷狀態先被置位了,然后我們調用了sleep方法,線程不會休眠,相反,它將清除中斷狀態,然后拋出InterruptedException.
       我們調用了interrupt并不意味著線程會終止,線程是否會終止,以及會如何繼續,是程序員來控制的托福答案
       在本文中我們將會討論終止線程的規范用法,然后在一個例子中實際應用,在這個例子中我們模擬了文件拷貝和游戲繪圖兩種情形。做出的效果如下圖所示,點擊start后上方進度條會顯示文件拷貝的進度,點擊end則會停止拷貝。點擊draw會在畫面中不停繪制各種各樣的矩形,點擊stop則會停止繪制。
       首先我們來看兩種情形的后臺線程寫法:
       public void run() {
       try{
       …
       while(!Thread.currentThread.isInterrupted() && more work to do)
       {
       do more work
       }
       }
       catch(InterruptedException)
       {
       //thread was interrupted during sleep or wait
       }
       finally
       {
       cleanup, if required
       }
       //exiting the run method terminates the thread }
       public void run() {
       try{
       …
       while( more work to do)
       {
       do more work
       Thread.sleep(delay);
       }
       }
       catch(InterruptedException)
       {
       //thread was interrupted during sleep or wait
       }
       finally
       {
       cleanup, if required
       }
       //exiting the run method terminates the thread }
       第一種寫法適用于后臺下載,文件拷貝以及類似情形,第二種寫法適合游戲畫面刷新或者類似情形。
       第一種寫法利用了interrupt方法,作為終止的請求,使得循環跳出,run方法執行完畢。而第二種方法則是利用當線程sleep的時候調用interrupt會拋出InterruptedException從而跳出了循環進而線程執行到結束www.yxysedu.com
       事實上這兩種寫法的區別就在于第二種使用了sleep.
       在我們的使用示例中,對應這兩種方法的使用代碼如下:
       這一段是實現文件拷貝的:
       private class CopyRunnable implements Runnable {
       @Override
       public void run() {
       File fromFile = new File(Environment.getExternalStorageDirectory()
       .getAbsolutePath() + "/abc.exe");
       long fileLength = fromFile.length();
       long copyedLength = 0;
       File toFile = new File(Environment.getExternalStorageDirectory()
       .getAbsolutePath() + "/abc_.exe");
       if (toFile.exists()) {
       toFile.delete();
       }
       try {
       FileInputStream fileInputStream = new FileInputStream(fromFile);
       FileOutputStream fileOutputStream = new FileOutputStream(
       toFile, true);
       byte[] buffer = new byte[2048];
       int readLength = 0;
       while (!Thread.currentThread()。isInterrupted()
       && (readLength = fileInputStream.read(buffer)) != -1) {
       fileOutputStream.write(buffer, 0, buffer.length);
       copyedLength += readLength;
       int progress = (int)
       ((float) copyedLength / fileLength * 100);
       handler.obtainMessage(0, progress, 0)。sendToTarget();
       }
       } catch (FileNotFoundException e) {
       e.printStackTrace();
       } catch (IOException e) {
       e.printStackTrace();
       } finally {
       handler.obtainMessage(1)。sendToTarget();
       }
       }
       }
       這一段是實現矩形繪圖的:
       private class DrawRunnable implements Runnable {
       @Override
       public void run() {
       try {
       while (true) {
       long beginTime = System.currentTimeMillis();
       paint.setColor(getColor());
       getCoor();
       postInvalidate();
       long endTime = System.currentTimeMillis();
       if (endTime - beginTime < 150) {
       Thread.sleep(150 - (endTime - beginTime));
       }
       }
       } catch (InterruptedException e) {
       e.printStackTrace();
       } finally {
       }
       }
       }
       實際上這兩種寫法都是利用了interrupt方法的特點,通過線程的中斷置位或者異常拋出來跳出循環進而終結線程。如果對這段代碼感興趣,可以到文章最后下載代碼。
       最后做一下方法總結:
       void interrupt()
       向線程發送中斷請求。線程的中斷狀態將被設置為true.如果目前該線程被一個sleep調用阻塞,那么,InterruptedException異常被拋出。
       static boolean interrupted()
       測試當前線程(即正在執行這一命令的線程)是否被中斷,注意,這是一個靜態方法。這一調用會產生副作用,它將當前線程的中斷狀態設置為false.
       boolean isInterrupted()
       測試線程是否被中斷。不像靜態的中斷方法,這一調用不會改變線程的中斷狀態。
       static Thread currentThread()
       返回代表當前執行線程的Thread對象。

    posted on 2013-11-21 17:54 好不容易 閱讀(153) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    PK10開獎 PK10開獎
    主站蜘蛛池模板: 亚洲一区精品无码| 久久亚洲精品无码网站| 国产精品亚洲二区在线| 毛片免费在线视频| 久热免费在线视频| 久久精品亚洲乱码伦伦中文| 麻豆高清免费国产一区| 国产情侣久久久久aⅴ免费 | 97在线免费观看视频| 亚洲一级特黄特黄的大片| 亚洲国产综合精品| 区久久AAA片69亚洲| 国产成人毛片亚洲精品| 亚洲综合在线一区二区三区| 久久不见久久见免费视频7| 午夜精品免费在线观看| 久久精品国产亚洲AV电影| 国产在线精品观看免费观看| 亚洲经典在线中文字幕| 成人性生免费视频| 亚洲av无码一区二区三区在线播放| 亚洲AV成人无码网站| 青娱乐免费视频在线观看| 国产在线观看麻豆91精品免费| 亚洲免费观看在线视频| 波多野结衣免费在线| 情侣视频精品免费的国产| 亚洲熟妇无码AV不卡在线播放| 最近2019中文字幕免费大全5| 成人片黄网站色大片免费观看cn| 美女啪啪网站又黄又免费| 亚洲av永久无码一区二区三区| 热久久这里是精品6免费观看| 久久久久免费看成人影片| 中文字幕亚洲免费无线观看日本| a毛片免费全部在线播放**| 2019中文字幕免费电影在线播放| 国产免费久久精品丫丫| 91情国产l精品国产亚洲区| 亚洲第一页在线播放| 97视频热人人精品免费|