傳統執行緒技術回顧
傳統是相對於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 ...