[10]多線程和Timer類
一.多線程
*** 1.創建線程
a.定義一個類繼承Thread類, 重寫run()方法, 創建該類對象, 調用start()方法.
程序會開啓一條新線程, 在新線程上自動調用run()方法.
b.定義一個類實現Runnable接口, 實現run()方法, 創建Thread對象, 構造函數中傳入Runnable對象, 調用start()方法.
程序會開啓一條新線程, 在新線程上自動調用Runnable的run()方法.
2.Thread類常用方法
a.currentThread()
獲取當前線程對象
b.getName()
獲取線程的名字
c.setName(String)
設置線程的名字
d.sleep(long)
控制線程休眠指定毫秒
e.setDaemon(boolean)
設置線程爲後臺(守護)線程, 後臺線程不會單獨執行. 注意, 必須在線程開啓之前設置.
f.join()
當前線程暫停, 指定線程加入, 等待指定線程執行結束, 當前線程繼續
* 3.同步
a.同步代碼塊
使用synchronized(鎖對象){ 同步代碼 }方式定義同步代碼塊
多個同步代碼塊如果使用相同的鎖對象, 那麼同一時間內只能執行一個
b.同步方法
如果整個方法內的代碼都需要同步, 那麼可以在方法聲明上加上synchronized
在同一個對象上的同步方法, 同一時間只能執行一個
同步方法默認使用this作爲鎖對象
如果希望同步方法和同步代碼塊進行同步, 那麼同步代碼塊也要自劃定鎖對象爲this
c.什麼時候用同步
兩個線程在執行兩段代碼的時候, 其中一段代碼執行的過程中不希望CPU切換到另一段代碼.
可以將兩段代碼放在同步代碼塊中, 使用相同的鎖對象, 這樣同一時間內只能執行一段代碼.
d.線程安全問題
當多個線程併發訪問同一數據, 有可能出現線程安全問題.
這時就可以使用同步技術來解決, 將訪問數據的代碼放在同步代碼塊中, 這樣做同一時間只能有一條線程訪問數據.
e.死鎖
在多線程併發執行的時候, 儘量避免多層同步代碼嵌套使用, 有可能互相沖突, 造成死鎖
4.通信
a.等待
使用鎖對象的wait()方法進行等待
b.喚醒
使用鎖對象的notify()方法進行喚醒, 該方法是喚醒隨機一個線程
使用notifyAll()方法可以喚醒所有等待的線程
5.JDK5的同步
使用ReentrantLock類創建一個鎖對象, 在需要同步的代碼前執行lock()方法, 同步結束的地方unlock()
6.JDK5的通信
使用ReentrantLock可以調用newCondition()方法創建Condition對象
使用Condition對象await()方法可以控制當前線程等待
使用Condition對象的signal()方法可以喚醒指定的線程
二.Timer類
1.創建計時器
Timer timer = new Timer();
2.安排任務
schedule(TimerTask task, long delay)
安排一個任務, 等待delay毫秒後執行
schedule(TimerTask task, long delay, long period)
安排一個任務, 等待delay毫秒後執行, 每隔period毫秒再執行
schedule(TimerTask task, Date time)
安排一個任務, 等待time時間開始執行
schedule(TimerTask task, Date firstTime, long period)
安排一個任務, 等待firstTime時間開始執行, 每隔period毫秒再執行
修改鼠標懸浮提示