張孝祥_Java多線程與併發庫高級應用01

張孝祥_Java多線程與併發庫高級應用
【視頻介紹:】
    Java線程是一項非常基本和重要的技術,在偏底層和偏技術的Java程序中不可避免地要使用到Java線程技術,特別是android手機程序和遊戲開發中,多線程成了必不可少的一項重要技術。但是,很多Java程序員對Java線程技術的瞭解都僅停留在初級階段,在項目中一旦涉及到多線程時往往就表現得糟糕至極,所以,軟件公司常常使用Java線程技術來考察面試者的基本功和判斷其編碼水平的高低。
    本套視頻教程是專門爲了幫助那些已經學習和了解過、但掌握得並不是很深入的人們提高java線程技術而講解的,所以,Java線程初學者學習本視頻教程時可能會比較吃力,可能必須耐心學習多遍才能漸入佳境,但是,你一旦掌握了其中的內容,你對Java線程技術的瞭解將會相當出衆!
【視頻目錄列表:】
 
    01. 傳統線程技術回顧
    02. 傳統定時器技術回顧
    03. 傳統線程互斥技術
    04. 傳統線程同步通信技術
    05. 線程範圍內共享變量的概念與作用
    06. ThreadLocal類及應用技巧
    07. 多個線程之間共享數據的方式探討
    08. java5原子性操作類的應用
    09. java5線程併發庫的應用
    10. Callable與Future的應用
    11. java5的線程鎖技術
    12. java5讀寫鎖技術的妙用
    13. java5條件阻塞Condition的應用
    14. java5的Semaphere同步工具
    15. java5的CyclicBarrier同步工具
    16. java5的CountDownLatch同步工具
    17. java5的Exchanger同步工具
    18. java5阻塞隊列的應用
    19. java5同步集合類的應用
    20. 空中網挑選實習生的面試題1 
    21. 空中網挑選實習生的面試題2 
    22. 空中網挑選實習生的面試題3 
    23. 源代碼與資料
 

01. 傳統線程技術回顧
傳統是相對於JDK1.5而言的
	傳統線程技術與JDK1.5的線程併發庫
	線程就是程序的一條執行線索/線路。
創建線程的兩種傳統方式
1.	創建Thread的子類,覆蓋其中的run方法,運行這個子類的start方法即可開啓線程
Thread thread = new Thread()
	{	@Override
	public void run()
	{
	while (true)
	{
	獲取當前線程對象		獲取線程名字
	Thread.currentThread()		threadObj.getName()
	讓線程暫停,休眠,此方法會拋出中斷異常InterruptedException
	Thread.sleep(毫秒值);
}
}
};

thread.start();

1.      創建Thread時傳遞一個實現Runnable接口的對象實例

Thread thread =new Thread(new Runnable()

{

       public void run()

       {}

});

              thread.start();

 

問題:下邊的線程運行的是Thread子類中的方法還是實現Runnable接口類的方法

new Thread(

                     b、傳遞實現Runnable接口的對象

                     new Runnable()

                     {

                     publicvoid run()

                     {}

}

){

                     a、覆蓋Thread子類run方法

public void run(){}

}.start();

       分析:new Thread(Runnable.run()){run()}.start();

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

 

總結:

由Thread類中的run方法源代碼中看出,兩種傳統創建線程的方式都是在調用Thread對象的run方法,如果Thread對象的run方法沒有被覆蓋,並且像上邊的問題那樣爲Thread對象傳遞了一個Runnable對象,就會調用Runnable對象的run方法。

多線程並不一定會提高程序的運行效率。舉例:一個人同時在三張桌子做饅頭

多線程下載:並不是自己電腦快了,而是搶到更多服務器資源。例:服務器爲一個客戶分配一個20K的線程下載,你用多個線程,服務器以爲是多個用戶就分配了多個20K的資源給你。

 

02. 傳統定時器技術回顧

傳統定時器的創建:直接使用定時器類Timer

a、過多長時間後炸

newTimer().schedule(TimerTask定時任務, Date time定的時間);

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

newTimer().schedule(TimerTask定時任務, Long延遲(第一次執行)時間, Long間隔時間);

TimerTask與Runnable類似,有一個run方法

Timer是定時器對象,到時間後會觸發炸彈(TimerTask)對象

示例:

newTimer().schedule(

new TimerTask()定時執行的任務

{

       public void run()

       {

       SOP(“bombing”);

}

顯示計時信息

while (true)

{

       SOP(newDate().getSeconds());

       Thread.sleep(1000);

}

},

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

);

問題:2秒後炸,爆炸後每隔3秒再炸一次

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

classMyTimerTask extends TimerTask            這就是準備用的子母彈

{

       public void run()

       {

              本身就是一顆炸彈

              SOP(bombing);

              內部子彈

              new Timer().schedule(

new MyTimerTask(), 2000

);

       }

}

       放置子母彈,2秒後引爆

       newTimer().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來完成。



發佈了19 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章