1. 程式人生 > >進程與線程的區別?--多線程與線程池

進程與線程的區別?--多線程與線程池

width executors 出現異常 col 等待 spa 死機 之間 volatile


  每個進程都是一個程序,進程之間相互獨立。除分布式外,進程數據之間,內存是不共享的。

  線程存在於進程之中,一個進程包括一個或多個線程,每個線程都是一條路徑,線程之間共享數據。


多線程

  優點:合理利用CPU資源,單線程獨占CPU資源,浪費CPU資源。並且可以提高程序的運行效率

  缺點:1、如果有大量的線程運行,會消耗大部分內存,會影響性能(可能會死機),CPU需要他們之間的切換。

      2、線程運行可能會出現死鎖、線程安全問題(修改操作時你要考慮使用synchronized、lock(接口)、volatile)

  synchronized關鍵字能保證在該方法中只有一個線程進入。只有當該線程執行結束或者出現異常,才會自動釋放鎖。否則其他線程必須的等待該線程釋放。並且synchronized關鍵字是可重入鎖,即在執行的時候如果從一個同步方法跳到了另一個同步方法,該線程不會再去申請鎖,因為它還沒釋放。並且該關鍵字是非公平鎖,每當一個線程釋放鎖後,無法保證誰會搶到該鎖。

  Lock是一個接口,在使用鎖的時候要在run()方法調用lock()方法。 切記不可再run()方法中聲明Lock接口再調用lock(),這樣每次都會生成新鎖,無法鎖住該方法。每次在最後調用unlock()方法來釋放鎖,因為它不會自動釋放鎖。不釋放會造成死鎖現象。也是可重入鎖。默認是非公平鎖,如果聲明時調用帶參構造為true時,將會變成公平鎖。即等待時間最長的線程首先獲得鎖。在讀寫操作時,ReadWriteLock接口有readlock()/writelock()。讀操作可以同時進行。寫操作有鎖時,讀寫操作都要等待。讀操作時只有寫操作等待。

  volatile關鍵字可以保證數據的可見性。並不是鎖。而且在使用的同時,要盡量保證它是一個標識符while(flag){}.其中flag可以是可見的。因為volatile無法保證原子性操作。該關鍵字可以保證對一個變量的寫操作先行發生於後面對這個變量的讀操作。

線程池

  優點:可以減少創建與銷毀線程的開銷、可以規定池內最大線程數,避免過多資源競爭消耗內存。能更好的控制線程開啟與回收並且能定時執行任務。

  Executors 提供四種線程池:

  Executors.newFixedThreadPool(個數):創建固定個數的線程池,超出的線程會在隊列中等待,如有發生異常的線程,會自動創建一個新線程。

  Executors.newSingleThreadExecutor():創建一個只有一個單一線程的線程池,保證執行有序性,如有發生異常的線程,會自動創建一個新線程。

  Executors.newCachedThreadPool():創建一個緩存的線程池,如果有之前的線程可以使用,則使用,否則創建。休閑時間超過60秒的線程將被廢棄。

  Executors.newScheduledThreadPool(個數):此線程池支持定時及周期性執行任務的需求。

進程與線程的區別?--多線程與線程池