Java中多線程技術

jopen 10年前發布 | 20K 次閱讀 Java Java開發

    最近由于工作的原因開始決定系統學習一下Java的多線程機制。Java語言的一大特點就是內在支持多線程,這和很多語言需要通過外部開發包來實現多線程有本質區別。每個程序都有一個主線程,當程序啟動時自動執行。關于多線程的一些概念性東西,見這篇博文:多線程初步

1、Java內在支持多線程

       為什么說Java內在支持多線程呢?根本原因是Java是完全面向對象的,所有Java類都有一個共同的父類-Object類。關于Object類的介紹,可以參考Java官方技術文檔,在此提供一個博文鏈接Object類 。Object類有涉及線程同步的notify()、notifyAll()、wait()、wait(long timeOut)等函數,這些函數可以很好地喚醒或阻塞在當前對象監視器上等待線程。Java中線程有4個狀態,創建狀態、可運行狀態、運行狀態、撤消狀態。

20141031222810571.jpg

2、Java多線程的實現

      要編寫多線程程序,Java中必須直接或間接的使用Thread類或Runnable接口,然后重寫run()方法(此方法是完成多線程各自任務的方法)。

2.1Thread類

    通過繼承Thread類,重寫Thread的run()方法,將線程要實現的邏輯放在run()方法中實現。

1)、start方法
    start()啟動一個線程,當調用start方法后,系統才會開啟一個新的線程來執行用戶定義的子任務,在這個過程中,會為相應的線程分配需要的資源,不能多次啟動一個線程。
2)、run方法
  run()方法是不需用戶顯示調用的,當通過start方法啟動一個線程之后,當線程獲得了CPU執行時間,便進入run方法體去執行具體的任務。注意,繼承Thread類必須重寫run方法,在run方法中定義具體要執行的任務。
3)、sleep(long millis) 方法
  sleep相當于讓線程睡眠,交出CPU,讓CPU去執行其他的任務。但要注意,sleep方法不會釋放鎖,也就是說如果當前線程持有對某個對象的鎖,則即使調用sleep方法,其他線程也無法訪問這個對象。
4)、yield()方法
    調用yield方法會讓當前線程交出CPU權限,讓CPU去執行其他的線程。它跟sleep方法類似,同樣不會釋放鎖。但是yield不能控制具體的交出CPU的時間,另外,yield方法只能讓擁有相同優先級的線程有獲取CPU執行時間的機會。注意,調用yield方法并不會讓線程進入阻塞狀態,而是讓線程重回就緒狀態,它只需要等待重新獲取CPU執行時間,這一點是和sleep方法不一樣的。
5)、stop方法
      stop方法已經是一個廢棄的方法,它是一個不安全的方法。因為調用stop方法會直接終止run方法的調用,并且會拋出一個ThreadDeath錯誤,如果線程持有某個對象鎖的話,會完全釋放鎖,導致對象狀態不一致。所以stop方法基本是不會被用到的。

2.2Runnable接口

     有時類本就是屬于派生類,但還需實現多線程。由于Java中不支持類的多繼承,所以引入Runnable接口,Runnable只有一個未實現的run()方法,然后實例化Thread對象。具體用法參見如下代碼:

    public class runnable implements Runnable  
    {  
        private static int m_nCount = 0;  
        @Override  
        public void run() {  
            // TODO Auto-generated method stub  
            ++ m_nCount;  
            System.out.println("m_nCount = "+m_nCount);  

        }  

        public static void main(String []agr)  
        {  
            Thread myThread1 = new Thread(new runnable());  
            Thread myThread2 = new Thread(new runnable());  
            myThread1.start();  
            myThread2.start();  
        }  
        }  

3、多線程的應用

     程序關于某個數據集在處理機上的一次執行過程;而線程是進程的某個執行路徑。一個進程可能有多個執行路徑,每個線程僅是其中的一條。關于多線程,具體分析見這個鏈接:不同終端多線程區別

1)、如果是多臺計算機分布式計算,則可通過多線程完全實現真正意義上的并行計算;

2)、如果是單臺計算機,但是有多個CPU,通過多線程也可實現真正意義上的并行計算;

3)、如果是我們普通的計算機-單機單CPU單核,即使在計算的時候使用多線程我認為也是不能夠實現真正意義上的并行的。

    上面1)、2)決定多線程可以應用在重復任務的場合,細分任務給不同的線程;3)啟發多線程可以應用于異步操作:耗時任務旁路分解,如UI計算任務用多線線程,客戶端這邊加個進度條顯示。

4、多線程的同步問題

     多線程的難點在于線程間的同步于互斥,典型的有生產者/消費者問題。關于多線程的一些同步問題,在后續會持續更新中。


來自:http://blog.csdn.net/xiaofengcanyuexj/article/details/40584239

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!