Java 第十三章
今天主要講了關於線程同步通訊以及定時器:Timer和TimerTask的有關方法,並例舉了一些案例。
為避免死結,就應該讓線程在進入阻塞狀態時盡量釋放其鎖定資源,以為其他的線程提供啟動並執行機會,Object類中定義了幾個有用的方法:wait()、notify()、notifyAll()。
1、wait():被鎖定的對象可以調用wait()方法,這將導致當前線程被阻塞並釋放該對象的互斥鎖,即解除了wait()方法當前對象的鎖定狀態,其他的線程就有機會訪問該對象。
2、notify():喚醒調用wait()方法後被阻塞的線程。每次運行該方法只能喚醒一個線程。
3、notifyAll():喚醒所有調用wait()方法被阻塞的線程。
定時器:Timer和TimerTask:
java.util包中的Timer和TimerTask類也可實現多線程
1、Timer類實現的是類似鬧鐘的功能,也就是定時或者每隔一定時間間隔觸發一次線程。
2、TimerTask類是一個抽象類別,該類實現了Runnable介面,具備多線程的能力。
通過繼承TimerTask類建立子類,使該子類獲得多線程的能力,將需要多線程執行的代碼書寫在run方法內部,然後通過Timer類啟動線程的執行。
執行個體,使用Timer和TimerTask組合實現的多線程。
class TimerTask1 extends TimerTask {
public void run() {
try{
for(int i = 0;i < 5;i++){
Thread.sleep(1000);
System.out.println("Run" + i);
}
}catch(Exception e){}
}
}
public class TestTimer {
public static void main(String[] args) {
Timer t = new Timer();//定時器
TimerTask1 tt1 = new TimerTask1();
t.schedule(tt1, 0);//啟動線程,tt1是需要啟動的線程對象
try{
for(int i = 0;i < 5;i++){
Thread.sleep(1000);
System.out.println("Main:" + i);
}
}catch(Exception e){}
}
}
schedule()方法:
1、public void schedule(TimerTask task,Date time):該方法的作用是在到達time指定的時間或已經超過該時間時執行線程task。
Date d = new Date(2009-1900,10-1,1,10,0,0);
t. schedule(task,d);
2、public void schedule(TimerTask task, Date firstTime, long period):在時間到達firstTime開始,每隔period毫秒就啟動一次task指定的線程,這種方式會重複啟動線程。
Date d = new Date(2009-1900,10-1,1,10,0,0);
t. schedule(task,d,20000);
4、public void schedule(TimerTask task,long delay)在執行schedule方法delay毫秒以後啟動線程task。
t.schedule(task,1000);//在執行該行啟動代碼1000毫秒後啟動一次線程task
5、public void schedule(TimerTask task,long delay,long period):在執行schedule方法delay毫秒以後啟動線程task,然後每隔period毫秒重複啟動線程task。
以上是今天所講的內容概述。