java基礎:執行緒與程式;執行緒的分工,協作,互斥;volatile關鍵字

Believer_YU發表於2020-11-09

這次就分享一下關於執行緒程式的經驗吧,不太高深,但還是希望對各位有所幫助!

一.程式執行緒的概念

執行緒:是程式執行中的單個順序流程。
程式:一個執行中的程式,是作業系統對其進行資源分配的最小單位。
多執行緒:一個程式可以同時執行多條執行緒,進行不同的任務。
一個程式通常會包含多個執行緒。

為什麼需要多執行緒呢?當我們做一件事的時候,如果一件一件的線性去做,就會浪費許多時間,因為有些步驟可以在其他某些步驟執行的時候同步執行,這樣才能保證效率。多執行緒就是如此。
舉個簡單的例子:
在這裡插入圖片描述

在這裡插入圖片描述
下面是程式碼的具體實現:

public class Run implements Runnable{
	public static void main(String[] args){
		Run r=new Run();
		Thread a= new Thread(r); //
		System.out.println("燒水泡茶工序:");
		System.out.println("1、洗水壺");
		System.out.println("2、燒水");
		a.start();
		try {
			a.join();
		} 
		catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("6、泡茶");
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub 
		System.out.println("3、洗茶壺");
		System.out.println("4、洗茶杯");
		System.out.println("5、拿茶葉");
	}
}

二.資源分配

程式:每個程式都有自己獨立的記憶體空間和系統資源,其內部資料和狀態是獨立的。
執行緒:同類的多個執行緒共享一塊記憶體空間和系統資源,其本身的資料只有微處理器的暫存器資料以及供程式執行時使用的堆疊。
在這裡插入圖片描述

所以作業系統執行執行緒時負荷較小,執行緒也被稱為輕負荷程式

提到執行緒,通常會從三個方面分析:分工(建立)協作(同步通訊)互斥(資源共享)

三.執行緒的建立

(1)直接繼承Thread類覆蓋run方法。

public class mythread extends Thread{
   public static void main(String args[]){
       Thread t = new Thread();
       t.start();
   }
   public void run(){
      System.out.println("thread run");
   }
}

(2)實現runable介面並將實現類物件作為引數傳給Thread類的構造方法。

public class mythread implements Runable{
   public static void main(String args[]){
     mythread t = new mythread():
     Thread a = new Thread(t);
     a.start();
   }
   public void run(){
     System.out.println("thread run");
     }
}

兩種方法的比較:
(1)直接繼承thread類方法編寫簡單,可以直接操控該執行緒。
(2)實現runable介面可以讓多個執行緒共享實現類的資源。

四.執行緒的控制和排程

一個執行緒從建立,執行到消亡的過程為執行緒的生命週期。
執行緒具有五種狀態:
(1)建立狀態:僅是一個物件,系統還未分配資源給它。
(2)可執行狀態:start方法啟動一個執行緒之後,系統分配了除CPU以外的所有資源。
(3)執行中狀態:系統排程系統選中了一個可執行狀態的執行緒,使其佔有CPU轉化為執行中狀態。
(4)阻塞狀態:一個執行中狀態遇到特殊情況讓出CPU暫時中止執行。
(5)死亡狀態:執行緒結束,到達run方法的末尾,或者執行緒丟擲一個未捕獲的異常或錯誤。

在這裡插入圖片描述

執行緒的排程和優先順序

在這裡插入圖片描述

搶佔式排程:高優先順序的執行緒採用獨佔方式排程,除非其執行完畢,或者進入阻塞狀態,低優先順序的執行緒才能獲得執行權。當多個處於可執行狀態的執行緒中有高優先順序的執行緒,高優先順序的執行緒立即執行,即便是處於執行中狀態的執行緒也要轉為可執行狀態,讓高優先順序的執行緒執行。

時間片輪轉排程:多個優先順序相同的執行緒處於可執行狀態時,每個執行緒輪流獲得一個時間片執行,當時間片過去時,即使沒有執行完畢,也要讓出CPU,等待下一個時間片的到來。

五.執行緒的互斥

多執行緒環境下,當多執行緒共同訪問同一個資源時,容易出現執行緒安全問題。

所以要用到volatile修飾符和synchronized關鍵字

(1)volatile修飾符:將被共享的變數宣告為 valatile,指示這個JVM是不穩定的,每次使用它都有到主存中進行讀取。
(2)synchronized:Java引入監視器來保證資料共享的同步性,任何物件都可作為一個監視器,當被synchronized關鍵字修飾時,該物件就成為監視器。

多個執行緒對共享資源進行操作的時候容易起衝突,這些易起衝突的程式碼塊成為臨界區。在臨界區中引入監視器,並且用synchronized使多個執行緒同步起來,只有獲得監視權的執行緒才能進入臨界區,只能有一個執行緒獨佔執行臨界區的程式碼塊,從而避免多個執行緒直接的衝突。

在這裡插入圖片描述

六.執行緒的協作(同步通訊)

在這裡插入圖片描述

在這裡插入圖片描述

七.執行緒的應用場景

1、大多數WEB伺服器處理客戶端的服務請求就採用的是多執行緒模式,每個客戶相當於激發該服務的一個處理執行緒。

2、當處理一個執行時間較長的請求時,一般讓一個執行緒進行處理,而另一個執行緒進行控制,這樣,如果使用者需要選擇“取消”時,可以強迫處理執行緒停止執行。

3、通訊時,可以讓一個執行緒負責接收,另一個負責傳送,這樣可以實現通訊的“全雙工”。

4、對WEB伺服器進行測試時,可以在一個程式中產生多個執行緒,每個線
程相當於一個客戶對WEB伺服器進行訪問,從而可以編寫壓力測試工具。
但要注意的是,對於一個程式,不要產生過多的執行緒,否則執行緒之間的切
換將會造成效率非常低下。

相關文章