Java多執行緒與併發庫高階應用詳解

2021-08-22 11:34:46 字數 1942 閱讀 5535

傳統執行緒技術回顧

傳統是相對於jdk1.5而言的

傳統執行緒技術與jdk1.5的執行緒併發庫

執行緒就是程式的一條執行線索/線路。

建立執行緒的兩種傳統方式

1.建立thread的子類,覆蓋其中的run方法,執行這個子類的start方法即可開啟執行緒

thread thread = new thread() }

}; thread.start();

2.建立thread時傳遞乙個實現runnable介面的物件例項

thread thread = new thread(new runnable()

});

thread.start();

問題:下邊的執行緒執行的是thread子類中的方法還是實現runnable介面類的方法

new thread(

b、傳遞實現runnable介面的物件

new runnable() }

) }.start();

分析:new thread(runnable.run()).start();

子類run方法實際就是覆蓋父類中的run方法,如果覆蓋了就用子類的run方法,不會再找runnable中的run方法了,所以執行的是子類中的run方法

傳統定時器技術回顧

傳統定時器的建立:直接使用定時器類timer

a、過多長時間後炸

new timer().schedule(timertask定時任務, date time定的時間);

b、過多長時間後炸,以後每隔多少時間再炸

new timer().schedule(timertask定時任務, long延遲(第一次執行)時間, long間隔時間);

timertask與runnable類似,有乙個run方法

timer是定時器物件,到時間後會觸發炸彈(timertask)物件

示例:

new timer().schedule(

new timertask()定時執行的任務

顯示計時資訊

while (true)

}, 10 定好的延遲時間,10秒以後執行任務

); 問題:2秒後炸,**後每隔3秒再炸一次

定時器2秒後炸,炸彈裡還有定時器(每3秒炸一次)

class mytimertask extends timertask 這就是準備用的子母彈 }

放置子母彈,2秒後引爆

new timer().schedule(new mytimertask(), 2000);

問題延伸:

上面的問題延伸,母彈炸過後,子彈每隔3秒炸一次,再每隔8秒炸一次

1、在mytimertask內部定義乙個靜態變數記錄炸彈號,在run方法內將炸彈號加1,每次產生新炸彈,號碼就會加1,根據炸彈號判斷是3秒炸還是8秒炸。

注意:內部類中不能宣告靜態變數

定義乙個靜態變數private static count = 0;

在run方法內部:count=(count+1)%2;

將定時器的時間設定為:2000+2000*count

2、用兩個炸彈來完成,a炸彈炸完後啟動定時器安裝b炸彈,b炸彈炸完後也啟動乙個定時器安裝a炸彈。

定時器還可以設定具體時間,如某年某月某日某時……可以設定周一到周五做某事,自己設定的話需要換算日期時間,可以使用開源工具quartz來完成。

傳統執行緒互斥技術

執行緒安全問題例子:銀行轉賬

同乙個賬戶一邊進行出賬操作(自己交學費),另一邊進行入賬操作(別人給自己付款),執行緒不同步帶來的安全問題

示例:逐個字元的方式列印字串

class outputer

{ public void output(string name)

{ int len = name.length();

for (int i=0; i

多執行緒 Java多執行緒與併發

實現的方式主要有三種 執行緒的狀態 基本差別 最主要的本質區別 兩個概念 鎖池 假設執行緒a已經擁有了某個物件 不是類 的鎖,而其他執行緒b c想要呼叫這個物件的某個synchronized方法 或者塊 由於b c執行緒在進入物件的synchronized方法 或者塊 之前必須先獲得該物件鎖的擁有權...

Java多執行緒與併發 Java鎖

累嗎?累就對了,說明你還活著 公平鎖 是指多個執行緒按照申請鎖的順序來獲取鎖,類似排隊打飯,先來後到。非公平鎖 是指多個執行緒獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的執行緒比先申請的執行緒優先獲取鎖。在高併發的情況下,有可能會造成優先順序反轉或者飢餓現象 並發包中reentrantlock...

Java併發 多執行緒

執行緒狀態 每個執行緒可以看做不同的任務,cpu需要分配每個執行緒不同的使用時間,cpu需要不同的執行緒之間來回切換,造成執行緒可能存在的不同狀態。新建執行緒 public class thread1 extends thread public class runnable1 implements ...