java編程思想之多線程知識講解,一篇就夠了

猿之生活java技術學堂 發佈 2022-11-26T23:11:15.908715+00:00

創作不易,關注、點讚,分享,轉發,評論,收藏利用對象,可將一個程序分割成相互獨立的區域。「進程」是指一種「自包容」的運行程序,有自己的地址空間。「多任務」作業系統能同時運行多個進程(程序)——但實際是由於CPU 分時機制的作用,使每個進程都能 循環獲得自己的CPU 時間片。

創作不易,關注、點讚,分享,轉發,評論,收藏

利用對象,可將一個程序分割成相互獨立的區域。

「進程」是指一種「自包容」的運行程序,有自己的地址空間。

「多任務」作業系統能同時運行多個進程(程序)——但實際是由於CPU 分時機制的作用,使每個進程都能 循環獲得自己的CPU 時間片。

java程序的進程里有幾個線程:主線程,垃圾回收線程(後台線程)等

進程與線程的基礎區別

1、進程是資源分配的最小單位,線程是程序執行的最小單位

2、進程有自己的獨立地址空間,系統就會為它分配地址空間,建立數據表來維護代碼段、堆棧段和數據段。

線程是共享進程中的數據的,使用相同的地址空間。

3、線程之間的通信更方便,同一進程下的線程共享全局變量、靜態變量等數據,

進程之間的通信需要以通信的方式(IPC)進行。

4、但是多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也死掉了,而一個進程死掉並不會對另外一個進程造成影響,因為進程有自己獨立的地址空間。

從線程繼承分析

創建一個線程,最簡單的方法就是從Thread 類繼承。Thread 最重要的方法是run()。

下面這個例子可創建任意數量的線程。

一個線程可以有四種狀態

  1. 新(New):線程對象已經創建,但未啟動線程。
  2. 可運行(Runnable):是指一旦時間分片機制對一個線程有空閒的CPU周期,那個線程就可以立即開始運行。
  3. 死(Dead):一個線程從自己的run()方法返回後,已經「死」了。也可以調用stop()使其消亡。
  4. 堵塞(Blocked):線程可以運行,但有東西在阻塞它。如果一個線程被阻塞,調度機制可以簡單地跳過它,不給它分配任何CPU時間。除非線程再次進入「可運行」狀態,否則不會採取任何操作。

線程的生命周期

線程為何會堵塞

(1) 調用sleep(毫秒數),使線程進入「睡眠」狀態。在設定的時間內,這個線程是不會運行的。

(2) suspend()用於暫停線程的執行。除非線程收到resume()消息,否則它不會返回到「可運行」狀態。

(3) 用wait()暫停了線程的執行。除非線程收到 nofify()或者notifyAll()消息,否則不會變成「可運行」 (是的,這看起來同原因2 非常相象,但有一個明顯的區別是我們馬上要揭示的)。

(4) 線程正在等候一些 IO(輸入輸出)操作完成。

(5) 線程試圖調用另一個對象的「同步」方法,但那個對象處於鎖定狀態,暫時無法使用。

睡眠

IO 堵塞

若一個數據流必須等候一些IO 活動,便會自動進入「堵塞」狀態。在本例下面列出的部分中,有兩個類協同 通用的 Reader 以及Writer 對象工作(使用Java 1.1 的流)。

線程衝突的原因

堆內存:進程公共區域,存儲所有線程都可以看到的資源。

用synchronized修飾符來解決

在任務線程中增添一個靜態屬性object,並用synchronized對其上鎖做到「監聽器」的作用。

Java提供了解決線程之間通信問題的方法

解決多線程並發安全問題

解決多線程的並發安全問題,java無非就是加鎖

(1)synchronized 是互斥鎖;

(2)ReentrantLock 顧名思義 :可重入鎖

(3)ReentrantReadWriteLock :讀寫鎖

關鍵字: