創作不易,關注、點讚,分享,轉發,評論,收藏
利用對象,可將一個程序分割成相互獨立的區域。
「進程」是指一種「自包容」的運行程序,有自己的地址空間。
「多任務」作業系統能同時運行多個進程(程序)——但實際是由於CPU 分時機制的作用,使每個進程都能 循環獲得自己的CPU 時間片。
java程序的進程里有幾個線程:主線程,垃圾回收線程(後台線程)等
進程與線程的基礎區別
1、進程是資源分配的最小單位,線程是程序執行的最小單位
2、進程有自己的獨立地址空間,系統就會為它分配地址空間,建立數據表來維護代碼段、堆棧段和數據段。
線程是共享進程中的數據的,使用相同的地址空間。
3、線程之間的通信更方便,同一進程下的線程共享全局變量、靜態變量等數據,
進程之間的通信需要以通信的方式(IPC)進行。
4、但是多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也死掉了,而一個進程死掉並不會對另外一個進程造成影響,因為進程有自己獨立的地址空間。
從線程繼承分析
創建一個線程,最簡單的方法就是從Thread 類繼承。Thread 最重要的方法是run()。
下面這個例子可創建任意數量的線程。
一個線程可以有四種狀態
- 新(New):線程對象已經創建,但未啟動線程。
- 可運行(Runnable):是指一旦時間分片機制對一個線程有空閒的CPU周期,那個線程就可以立即開始運行。
- 死(Dead):一個線程從自己的run()方法返回後,已經「死」了。也可以調用stop()使其消亡。
- 堵塞(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 :讀寫鎖