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

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

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

    中文JAVA技術(shù)平等自由協(xié)作創(chuàng)造

    Java專題文章博客和開源

    常用鏈接

    統(tǒng)計

    最新評論

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

      設(shè)想這樣的情景:我們的應(yīng)用在某一個時間段內(nèi),需要一個子線程不停的在后臺運行,這可能是一個下載過程,是一個對服務(wù)端socket的監(jiān)聽,也可能是一個繪圖的計算過程。當(dāng)我們想要終止線程的時候,我們會怎樣做呢?是設(shè)定一個標(biāo)志變量來控制跳出循環(huán)?還是使用thread.stop()?又或者是設(shè)置thread = null?托福答案
     
       有的時候我們需要一種規(guī)范的思路,使用規(guī)范的方法來解決一類問題。
     
       我們首先要明白,線程終止的條件,有三種情況:
     
       1.當(dāng)線程的run方法執(zhí)行方法體中最后一條語句后。
     
       2.當(dāng)執(zhí)行retutrn語句返回時。
     
       3.當(dāng)出現(xiàn)了在方法中沒有捕獲的異常時。
     
       在Java的早期版本中,還有一個stop方法,其他線程可以調(diào)用它終止線程,但是這個方法已經(jīng)被棄用了,所以還在用的同學(xué)就不要繼續(xù)用了。
     
       我們的正確思路是,使用interrupt方法來終止我們的線程。
     
       首先要理解interrupt方法做了什么:每一個線程都有一個中斷狀態(tài),這是一個boolean標(biāo)志,當(dāng)線程調(diào)用了interrupt方法時,這個中斷狀態(tài)就會被置位。如果我們要檢查中斷狀態(tài),可以使用Thread.currentThread()。isInterrupted()來獲得是否中斷。托福答案
     
       但是如果線程被阻塞了(sleep or wait),當(dāng)我們調(diào)用了interrupt方法的時候,就會產(chǎn)生InterruptedException異常。這是我們可以利用的地方。
     
       同樣的,如果中斷狀態(tài)先被置位了,然后我們調(diào)用了sleep方法,線程不會休眠,相反,它將清除中斷狀態(tài),然后拋出InterruptedException.
     
       我們調(diào)用了interrupt并不意味著線程會終止,線程是否會終止,以及會如何繼續(xù),是程序員來控制的。
     
       在本文中我們將會討論終止線程的規(guī)范用法,然后在一個例子中實際應(yīng)用,在這個例子中我們模擬了文件拷貝和游戲繪圖兩種情形。做出的效果如下圖所示,點擊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方法,作為終止的請求,使得循環(huán)跳出,run方法執(zhí)行完畢。而第二種方法則是利用當(dāng)線程sleep的時候調(diào)用interrupt會拋出InterruptedException從而跳出了循環(huán)進而線程執(zhí)行到結(jié)束。
     
       事實上這兩種寫法的區(qū)別就在于第二種使用了sleep.
     
       在我們的使用示例中,對應(yīng)這兩種方法的使用代碼如下:
     
       這一段是實現(xiàn)文件拷貝的:
     
       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();
     
       }
     
       }
     
       }
     
       這一段是實現(xiàn)矩形繪圖的:
     
       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方法的特點,通過線程的中斷置位或者異常拋出來跳出循環(huán)進而終結(jié)線程。如果對這段代碼感興趣,可以到文章最后下載代碼。
     
       最后做一下方法總結(jié):
     
       void interrupt()
     
       向線程發(fā)送中斷請求。線程的中斷狀態(tài)將被設(shè)置為true.如果目前該線程被一個sleep調(diào)用阻塞,那么,InterruptedException異常被拋出。
     
       static boolean interrupted()
     
       測試當(dāng)前線程(即正在執(zhí)行這一命令的線程)是否被中斷,注意,這是一個靜態(tài)方法。這一調(diào)用會產(chǎn)生副作用,它將當(dāng)前線程的中斷狀態(tài)設(shè)置為false.
     
       boolean isInterrupted()
     
       測試線程是否被中斷。不像靜態(tài)的中斷方法,這一調(diào)用不會改變線程的中斷狀態(tài)。
     
       static Thread currentThread()
     
       返回代表當(dāng)前執(zhí)行線程的Thread對象。
     
     

    posted on 2013-10-02 17:52 好不容易 閱讀(145) 評論(0)  編輯  收藏


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


    網(wǎng)站導(dǎo)航:
     
    PK10開獎 PK10開獎
    主站蜘蛛池模板: 国产乱妇高清无乱码免费| 精品无码专区亚洲| 日韩精品人妻系列无码专区免费 | 亚洲国产综合无码一区二区二三区 | 国产成A人亚洲精V品无码| 一级毛片在播放免费| 免费国产不卡午夜福在线| 美女一级毛片免费观看| 亚洲av区一区二区三| 免费毛片毛片网址| 久久久久亚洲爆乳少妇无| 久久国产免费直播| 久久噜噜噜久久亚洲va久| 99热免费在线观看| 亚洲H在线播放在线观看H| 永久免费AV无码国产网站| 亚洲精华液一二三产区| 国产乱子伦片免费观看中字| 理论亚洲区美一区二区三区 | 中文字幕精品亚洲无线码一区| 99视频免费在线观看| 久久久无码精品亚洲日韩蜜臀浪潮| 巨波霸乳在线永久免费视频| 亚洲av无码一区二区三区天堂古代| 成人免费在线视频| 一级做a爰片久久毛片免费陪| 亚洲精品高清国产一线久久| 久久久高清日本道免费观看| 91成人免费福利网站在线| 亚洲欧洲日韩国产综合在线二区| sihu国产精品永久免费| 九月丁香婷婷亚洲综合色| 最新欧洲大片免费在线| 免费播放国产性色生活片| 亚洲线精品一区二区三区| 天天影院成人免费观看| 美女被爆羞羞网站在免费观看| 亚洲av中文无码乱人伦在线咪咕| 成熟女人牲交片免费观看视频 | 亚洲AV日韩AV无码污污网站| 亚洲无线一二三四区手机|