<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      安卓筆記俠

      專注安卓開發

      導航

      Java并發編程(一)線程定義、狀態和屬性

      一 、線程和進程

      1. 什么是線程和進程的區別:
        線程是指程序在執行過程中,能夠執行程序代碼的一個執行單元。在java語言中,線程有四種狀態:運行 、就緒、掛起和結束。
        進程是指一段正在執行的程序。而線程有時也被成為輕量級的進程,他是程序執行的最小單元,一個進程可以擁有多個線程,各個線程之間共享程序的內功空間(代碼段、數據段和堆空間)及一些進程級的資源(例如打開的文件),但是各個線程都擁有自己的棧空間。


      2. 為何要使用多進程
       在操作系統級別上來看主要有以下幾個方面:
       - 使用多線程可以減少程序的響應時間,如果某個操作和耗時,或者陷入長時間的等待,此時程序講不會響應鼠標和鍵盤等的操作,使用多線程后可以把這個耗時的線程分配到一個單獨的線程去執行,從而使程序具備了更好的交互性。
       - 與進程相比,線程創建和切換開銷更小,同時多線程在數據共享方面效率非常高。
       - 多CPU或者多核計算機本身就具備執行多線程的能力,如果使用單個進程,將無法重復利用計算機資源,造成資源的巨大浪費。在多CPU計算機使用多線程能提高CPU的利用率。
       - 使用多線程能簡化程序的結構,使程序便于理解和維護

       

      二、創建線程
      多線程的實現一般有以下三種方法其中前兩種為最常用的方法:


      1. 繼承Thread類,重寫run()方法
      Thread本質上也是實現了Runnable接口的一個實例。需要注意的是調用start()方法后并不是是立即的執行多線程的代碼,而是使該線程變為可運行態,什么時候運行多線程代碼是由操作系統決定的。
      以下是主要步驟:
      (1)定義Thread類的子類,并重寫該類的run方法,該run方法的方法體就代表了線程要完成的任務。因此把run()方法稱為執行體。
      (2)創建Thread子類的實例,即創建了線程對象。
      (3)調用線程對象的start()方法來啟動該線程。

      public class TestThread extends Thread{ 
          public void run() {
                  System.out.println("Hello World");
              }  
          public static void main(String[] args) {
              Thread mThread = new TestThread();
              mThread.start(); 
          } 
      }
      View Code

       

      2. 實現Runnable接口,并實現該接口的run()方法
      以下是主要步驟:
      (1)自定義類并實現Runnable接口,實現run()方法。
      (2)創建Thread子類的實例,用實現Runnable接口的對象作為參數實例化該Thread對象。
      (3)調用Thread的start()方法來啟動該線程。

      public class TestRunnable implements Runnable {
          public void run() { 
                  System.out.println("Hello World");
              } 
      }
      
      public class TestRunnable {
          public static void main(String[] args) {
              TestRunnable mTestRunnable = new TestRunnable();      
              Thread mThread = new Thread(mTestRunnable);
              mThread.start(); 
          } 
      }
      View Code

       

      3. 實現Callable接口,重寫call()方法
      Callable接口實際是屬于Executor框架中的功能類,Callable接口與Runnable接口的功能類似,但提供了比Runnable更強大的功能,主要表現為以下的3點:
      (1)Callable可以在任務接受后提供一個返回值,Runnable無法提供這個功能。
      (2)Callable中的call()方法可以拋出異常,而Runnable的run()方法不能拋出異常。
      (3)運行Callable可以拿到一個Future對象,Future對象表示異步計算的結果,他提供了檢查計算是否完成的方法。由于線程屬于異步計算模型,因此無法從別的線程中得到函數的返回值,在這種情況下就可以使用Future來監視目標線程調用call()方法的情況,但調用Future的get()方法以獲取結果時,當前線程就會阻塞,直到call()方法的返回結果。

       1 public class TestCallable {  
       2     //創建線程類
       3     public static class MyTestCallable  implements Callable {  
       4         public String call() throws Exception {  
       5              retun "Hello World";
       6             }  
       7         }  
       8 public static void main(String[] args) {  
       9         MyTestCallable mMyTestCallable= new MyTestCallable();  
      10         ExecutorService mExecutorService = Executors.newSingleThreadPool();  
      11         Future mfuture = mExecutorService.submit(mMyTestCallable);  
      12         try { 
      13         //等待線程結束,并返回結果
      14             System.out.println(mfuture.get());  
      15         } catch (Exception e) {  
      16            e.printStackTrace();
      17         } 
      18     }  
      19 } 

      上述程序的輸出結果為:Hello World

        在這三種方式中,一般推薦實現Runnable接口的方式,其原因是:首先,Thread類定義了多種方法可以被派生類使用重寫,但是只有run()方法是必須被重寫的,實現這個線程的主要功能,這也是實現Runnable接口需要的方法。其次,一個類應該在他們需要加強或者修改時才會被繼承。因此如果沒有必要重寫Thread類的其他方法,那么在這種情況下最好是用實現Runnable接口的方式。

       

      三、中斷線程
      當線程的run()方法執行方法體中的最后一條語句后,并經由執行return語句返回時,或者出現在方法中沒有捕獲的異常時線程將終止。在java早期版本中有一個stop方法,其他線程可以調用它終止線程,但是這個方法現在已經被棄用了。
      interrupt方法可以用來請求終止線程,當一個線程調用interrupt方法時,線程的中斷狀態將被置位。這是每個線程都具有的boolean標志,每個線程都應該不時的檢查這個標志,來判斷線程是否被中斷。
      要想弄清線程是否被置位,可以調用Thread.currentThread().isInterrupted():

      while(!Thread.currentThread().isInterrupted()){
          do something
      }

      但是如果一個線程被阻塞,就無法檢測中斷狀態。這是產生InterruptedException的地方。當一個被阻塞的線程(調用sleep或者wait)上調用interrupt方法。阻塞調用將會被InterruptedException中斷。 
      如果每次迭代之后都調用sleep方法(或者其他可中斷的方法),isInterrupted檢測就沒必要也沒用處了,如果在中斷狀態被置位時調用sleep方法,它不會休眠反而會清除這一狀態并拋出InterruptedException。所以如果在循環中調用sleep,不要去檢測中斷狀態,只需捕獲InterruptedException。 
      在很多發布的代碼中會發現InterruptedException被抑制在很低的層次上:

      void myTask(){
      ...
      try{
          sleep(50)
      }catch(InterruptedException e){
      ...
      }
      }

      不要這樣做,如果不認為catch中做一處理有什么好處的話,有兩種合理的選擇:

      • 在catch中調用Thread.currentThread().interrup()來設置中斷狀態。調用者可以對其進行檢測
      • 更好的選擇用throw InterruptedException標記你的方法,不采用try語句塊來捕獲已成。這樣調用者可以捕獲這個異常:
        void myTask()throw InterruptedException{
            sleep(50)
        }

         

      四、線程的狀態

      (1). 新建狀態(New):新創建了一個線程對象。 
      (2). 就緒狀態(Runnable):線程對象創建后,其他線程調用了該對象的start()方法。該狀態的線程位于可運行線程池中,變得可運行,等待獲取CPU的使用權。 
      (3). 運行狀態(Running):就緒狀態的線程獲取了CPU,執行程序代碼。 
      (4). 阻塞狀態(Blocked):阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,才有機會轉到運行狀態。阻塞的情況分三種: 
      - 等待阻塞:運行的線程執行wait()方法,JVM會把該線程放入等待池中。 
      - 同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中。 
      - 其他阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。 
      (5). 死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命周期。

      這里寫圖片描述

      五、線程的優先級和守護線程

      1. 線程優先級 
      在java中,每一個線程有一個優先級,默認情況下,一個線程繼承它父類的優先級。可以用setPriority方法提高或降低任何一個線程優先級。可以將優先級設置在MIN_PRIORITY(在Thread類定義為1)與MAX_PRIORITY(在Thread類定義為10)之間的任何值。線程的默認優先級為NORM_PRIORITY(在Thread類定義為5)。 
      盡量不要依賴優先級,如果確實要用,應該避免初學者常犯的一個錯誤。如果有幾個高優先級的線程沒有進入非活動狀態,低優先級線程可能永遠也不能執行。每當調度器決定運行一個新線程時,首先會在具有搞優先級的線程中進行選擇,盡管這樣會使低優先級的線程完全餓死。

      2. 守護線程

      調用setDaemon(true);將線程轉換為守護線程。守護線程唯一的用途就是為其他線程提供服務。計時線程就是一個例子,他定時發送信號給其他線程或者清空過時的告訴緩存項的線程。當只剩下守護線程時,虛擬機就退出了,由于如果只剩下守護線程,就沒必要繼續運行程序了。 
      另外JVM的垃圾回收、內存管理等線程都是守護線程。還有就是在做數據庫應用時候,使用的數據庫連接池,連接池本身也包含著很多后臺線程,監控連接個數、超時時間、狀態等等。

      posted on 2016-12-04 16:04  安卓筆記俠  閱讀(662)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 性做久久久久久久久| 亚州中文字幕一区二区| 国产精品自在拍首页视频8| 亚洲精品自拍区在线观看| 亚洲国产精品久久久久婷婷老年| 国产综合亚洲区在线观看| 九九热热久久这里只有精品| 免费人成网站视频在线观看| 国产无遮挡又黄又爽免费网站| 国产精品久久777777| 精品九九热在线免费视频| 国产热A欧美热A在线视频| 日韩精品中文字幕人妻| 日韩一区二区三区理伦片| 久久国产成人av蜜臀| 午夜精品久久久久久99热| 无码一区二区三区免费| 91色老久久精品偷偷性色| gogo无码大胆啪啪艺术| 人妻少妇久久中文字幕一区二区| 亚洲五月丁香综合视频| av在线播放国产一区| 狠狠色综合久久丁香婷婷| 国产一区二区日韩在线| 亚洲春色在线视频| 天天综合亚洲色在线精品| 国产亚洲国产精品二区| 久久亚洲国产成人精品性色 | 香蕉久久久久久久av网站| 精品尤物国产尤物在线看 | 午夜自产精品一区二区三区| 中文毛片无遮挡高潮免费| 久久国产免费直播| 欧美孕妇乳喷奶水在线观看 | 久热这里只有精品在线观看 | 无码伊人久久大杳蕉中文无码| 亚洲区综合中文字幕日日| 中文字幕人妻无码一夲道| 真实单亲乱l仑对白视频| 亚洲国产精品一区在线看| 国产果冻豆传媒麻婆精东|