多程序與多執行緒

2022-09-13 06:45:13 字數 3903 閱讀 3700

一、程序

1、什麼是程序

通過任務管理器看到了程序的存在,只有執行的程式才會出現程序

程序:2、多程序有什麼意義?

(1)單程序的計算機只能做一件事,而我們現在的計算機都可以做多件事情。

二、執行緒

1、什麼是執行緒

在同乙個程序內又可以執行多個任務,而這每乙個任務就可以看成是乙個執行緒

2、多執行緒有什麼意義

(1)提高程式的使用率。

3、執行緒的生命週期

(1)新建:建立執行緒

(2)就緒:有執行資格,沒有執行權

(3)執行:有執行資格,有執行權

(4)死亡:執行緒物件變成垃圾,等待被**

4、實現多執行緒的兩種方式

(1)繼承thread類

package

cn.itcast_01;

public

class mythread extends

thread }}

package

cn.itcast_01;

public

class

threaddemo

}

問題:run()裡面封裝的是被執行緒執行的**

start()

run直接呼叫僅僅是普通方法

start()先啟動執行緒,再由jvm呼叫run()方法

(2)實現runnable介面

package

cn.itcast_02;

public

class myrunnable implements

runnable }}

package

cn.itcast_02;

public

class

myrunnabledemo

}

5、有了方式1,為什麼還要方式2

實現介面的好處

6、執行緒安全問題

(1)出現的原因

(2)如何解決執行緒安全問題

synchronized

(物件)

注意:同步可以解決安全問題的根本原因就在那個物件上,該物件如同鎖的功能

多個執行緒同一把鎖,鎖物件是任意物件

把同步加在方法上

鎖物件:this

把同步載入方法上

這裡的鎖物件是當前類的位元組碼檔案物件

7、死鎖問題

兩個或者兩個以上的執行緒在爭奪資源的過程中,發生的一種相互等待的現象

package

cn.itcast_02;

public

class dielock extends

thread

public

void

run() }}

else}}

}}

package

cn.itcast_02;

public

class

dielockdemo

}

(1)死鎖產生的原因

通常系統中擁有的不可剝奪資源,其數量不足以滿足多個程序執行的需要,使得程序在執行過程中,會因爭奪資源而陷入僵局,如磁帶機,印表機等。

只有對不可剝奪資源的競爭才可能產生死鎖,對可剝奪資源的競爭是不會產生死鎖的

程序在執行過程中,請求和釋放資源的順序不當,也同樣會導致死鎖

訊號量使用不當也會造成死鎖。程序間相互等待對方發來的訊息,結果也會使得這些程序間無法向前推進。

例如,程序a等待程序b發的訊息,程序b又在等待程序a發的訊息,可以看出程序a和程序b不是因為競爭同一資源,而是在等待對方的資源導致死鎖

(2)產生死鎖的四個必要條件:

(3)如何避免死鎖

當多個需要相同的一些鎖,但是按照不同的順序加鎖,死鎖就很容易產生

如果能確保所有的執行緒都是按照相同的順序獲得鎖,那麼死鎖就不會發生

若乙個執行緒沒有在給定的時限內成功獲得所有需要的鎖,則會進行回退並釋放所有已經獲得的鎖,然後等待一段隨機的時間再重試,這段隨機的等待時間讓其它執行緒有機會嘗試獲取相同的這些鎖,並且讓該應用在沒有獲得鎖的時候可以繼續執行(加鎖超時後可以先繼續執行幹點其它事情,再回頭來重複之前加鎖的邏輯)

主要針對那些不可能實現按序加鎖並且鎖超時也不可行的場景

當乙個執行緒請求鎖失敗時,這個執行緒可以遍歷鎖的關係圖看看是否有死鎖發生

做法:釋放所有鎖,回退,並且等待一段隨機的時間後重試。這個和簡單的加鎖超時類似,不一樣的是只有死鎖已經發生了才回退,而不會是因為加鎖的請求超時了。雖然有回退和等待,但是如果有大量的執行緒競爭同一批鎖,它們還是會重複地死鎖 (編者注:原因同超時類似,不能從根本上減輕競爭)。

乙個更好的方案是給這些執行緒設定優先順序,讓乙個(或幾個)執行緒回退,剩下的執行緒就像沒發生死鎖一樣繼續保持著它們需要的鎖。如果賦予這些執行緒的優先順序是固定不變的,同一批執行緒總是會擁有更高的優先順序。為避免這個問題,可以在死鎖發生的時候設定隨機的優先順序。

8、多執行緒狀態轉換圖

常見的情況:

9、執行緒池

程式啟動乙個新執行緒成本是比較高的

使用執行緒池可以很好的提高效能

執行緒池裡的每乙個執行緒**結束後,並不會死亡,而是再次回到執行緒池中成為空閒狀態,等待下乙個物件來使用

方法一:

public

class myrunnable implements

runnable

}

/*

* 執行緒池的好處:

* 如何實現執行緒的**?

* a:建立乙個執行緒池物件,控制要建立幾個執行緒物件

* public static executorservice newfixedthreadpool(int nthreads)

* b:這種執行緒池的執行緒可以執行

* 可執行runnable物件或者callable物件代表的執行緒

* 做乙個類實現runnable介面

* c:呼叫如下方法

* future> submit(runnable task)

* futuresubmit(callabletask)

* */

import

j**a.util.concurrent.executorservice;

import

j**a.util.concurrent.executors;

public

class

executorsdemo

}

方法二:

import

j**a.util.concurrent.callable;

public

class mycallable implements callable

public integer call() throws

exception

}

import

j**a.util.concurrent.executionexception;

import

j**a.util.concurrent.executorservice;

import

j**a.util.concurrent.executors;

import

j**a.util.concurrent.future;

public

class

callabledemo

}

多執行緒與多程序

程序 程序是程式的一次執行,在傳統的計算機中,程序既是基本的分配單元,也是基本的執行單元。執行緒 執行緒是可執行的實體單元,它是處理機排程的基本單位。由於執行緒在同一位址空間,因此建立和撤銷執行緒的開銷小,執行緒間的通訊效率高,切換迅速。在多處理機系統中,對程序的個數有所限制,但對執行緒的個數不存在...

多執行緒與多程序

魚還是熊掌 多程序多執行緒的選擇 關於多程序和多執行緒,教科書上最經典的一句話是 程序是資源分配的最小單位,執行緒是cpu排程的最小單位 這句話應付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這麼簡單了,選的不好,會讓你深受其害。經常在網路上看到有的xdjm問 多程序好還是多執行緒好?...

多程序與多執行緒

import threading建立乙個執行緒,指向的函式,不接收引數的情況 t threading.thread target 函式名 建立乙個執行緒,指向的函式,收引數的情況 t threading.thread target 函式名,args 實參1,執行緒物件名.start 生命週期 我們的...