1. JDK 1.0版本中有一個stop方法用于強制中止線程,但是現(xiàn)在這個方法被廢止。因此沒有方法強制中止線程,但是interrupt方法可以要求某個線程的中止。

          2. 某個線程的interrupt方法被調(diào)用后,該線程被設(shè)為中斷狀態(tài),這是一個boolean值,每個線程都應(yīng)當(dāng)定期檢查這個值,以知道自己是否被中斷。一個線程被interrupt并不意味著它必須結(jié)束,僅僅是發(fā)送了一個消息而已。

          3. Thread.currentThread().isInterrupted()方法返回一個boolean值,表示是否為中斷狀態(tài)。

          4. 當(dāng)某個線程阻滯時(如在sleep wait方法調(diào)用后),無法檢查中斷狀態(tài)。如果此時interrupt方法被調(diào)用,當(dāng)前的阻滯狀態(tài)就會被中止,并且產(chǎn)生InterruptedException。

          5. 一個run方法應(yīng)當(dāng)有這樣的形式:
          public void run() {
          try {
          //...
          while (!Thread.currentThread().isInterrupted() && more work to do) {
          //do more work
          }
          } catch (InterruptedException e) {
          //...
          }
          finally {
          //clean up, if required
          }
          }
          如果在線程每個工作段后都使用sleep方法,就不必檢查中斷狀態(tài)了,此時只要處理好InterruptedException就行了。

          6. 還有一個類似的靜態(tài)方法interrupted(),同樣返回一個boolean值,不同的是該方法同時把當(dāng)前中斷狀態(tài)設(shè)為了false。

          7. 有一個很不好習(xí)慣:捕獲InterruptedException后沒有進行任何的處理。如果的確想不到什么事情做,至少可以加上Thread.currentThread().interrupted()改變中斷狀態(tài),以便呼叫者知道這個情況;或者可以開頭聲明throws InterrupedException,并取消try塊,讓呼叫者處理這個問題。

          8. 線程的四個狀態(tài):New, Runnable, Blocked, Dead
          New狀態(tài):在new Thread(r)被調(diào)用后,start方法調(diào)用前。做一些初始化工作。
          Runaable狀態(tài):start方法調(diào)用后。一個線程在運行并不意味著它在不停地運行,事實上,應(yīng)當(dāng)不時的中斷,以便其他線程有機會運行。具體細節(jié)由操作系統(tǒng)決定。preemptive系統(tǒng)給每個線程一段時間運行,之后暫停該線程,給另一個線程運行的機會。選擇另一個線程時,系統(tǒng)會考慮優(yōu)先權(quán)。但是在cooperative系統(tǒng)中,只有在一個線程sleep或yield時才會交出控制權(quán)。
          Blocked:以下幾種情況會導(dǎo)致停滯:1)調(diào)用sleep方法 2)執(zhí)行了某個在IO上阻塞的操作 3)試圖獲得正被其他線程控制的lock 4)waits for a conditionsee page 5)其他人調(diào)用了該線程的suspend方法,注意這個方法已被廢止。
          當(dāng)一個線程從Blocked中恢復(fù)時(如sleep方法設(shè)定時間到,IO操作完成等),系統(tǒng)會根據(jù)優(yōu)先級決定是否繼續(xù)運行這個線程。
          不能簡單地調(diào)用線程的resume方法使之從Blocked狀態(tài)中恢復(fù)。如果要取消因IO操作導(dǎo)致的block,可以讓另一個線程關(guān)閉對應(yīng)的IO通道(channel),則原來那個線程恢復(fù)運行,并拋出ClosedChannelException。
          Death:run方法結(jié)束后線程就進入Death狀態(tài)。也可以通過調(diào)用線程的stop方法中止該線程運行,會拋出ThreadDeath錯誤。當(dāng)然,不要在你自己的代碼里使用這個方法。
          線程的isAlive()方法返回該線程是否已被中止(也有可能尚未運行)。


          posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          2.26 Java notes - Multithreading

          Posted on 2007-04-22 20:25 ZelluX 閱讀(249) 評論(0)  編輯  收藏 所屬分類: OOP
          2007-02-26 21:53:39
          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 道孚县| 遵化市| 萨嘎县| 大石桥市| 建阳市| 双鸭山市| 汉中市| 阜平县| 漳浦县| 西华县| 双流县| 万山特区| 板桥市| 英超| 合阳县| 岗巴县| 兴宁市| 寿光市| 苏州市| 肥城市| 宜黄县| 台安县| 桃园县| 泌阳县| 沙河市| 德令哈市| 枝江市| 于田县| 鹿邑县| 河北区| 民权县| 疏附县| 新巴尔虎左旗| 黄骅市| 西华县| 湛江市| 江川县| 和田市| 家居| 双江| 和林格尔县|