1. 程式人生 > 其它 >【Java】白話說Java多執行緒篇(四),生產者/消費者模式與定時任務

【Java】白話說Java多執行緒篇(四),生產者/消費者模式與定時任務

技術標籤:Javajava多執行緒併發程式設計設計模式jvm

【Java】白話說Java多執行緒篇(四),生產者/消費者模式與定時任務

文章目錄

執行緒併發協作(生產者/消費者模式)

執行緒併發協作(也叫執行緒通訊),通常用於生產者/消費者模式,情景如下:

  • 生產者和消費者共享同一個資源,並且生產者和消費者之間相互依賴,互為條件。
  • 對於生產者,沒有生產產品之前,消費者要進入等待狀態。而生產了產品之後,又需要馬上通知消費者消費
  • 對於消費者,在消費之後,要通知生產者已經消費結束,需要繼續生產新產品以供消費。
  • 在生產者消費者問題種,僅有synchronized是不夠的
    • synchronized可阻止併發更新同一個共享資源,實現了同步;
    • synchronized不能用來實現不同執行緒之間的訊息傳遞(通訊)。
  • 執行緒通過以下方法進行訊息傳遞:
方法名作用
final void wait()表示執行緒一直等待直到得到其他執行緒通知
void wait(long time)執行緒等待指定毫秒引數的時間
final void wait(long timeout,int nanos)執行緒等待指定毫秒,微秒的時間
final void notify()喚醒一個處於等待狀態的執行緒
final void notifyAll喚醒同一個物件上所有呼叫wait()方法的執行緒,優先級別高的執行緒優先執行

都只能在同步方法或者同步程式碼塊種使用,否則丟擲異常

定時任務

通過Timer和Timetask,我們可以實現定時啟動某個執行緒。

Timer是一種定時器工具,用來在一個後臺執行緒計劃執行指定任務。它可以計劃執行一個任務一次或反覆多次。
TimerTask一個抽象類,它的子類代表一個可以被Timer計劃的任務。

java.util.Timer

在這種實現方式種,Timer類作用就是類似鬧鐘的功能,也就是定時或者每隔一定時間觸發一次執行緒。
其實,Timer類本身實現的就是一個執行緒,只是這個執行緒是用來實現呼叫其他執行緒的。

java.util.TimerTask

TimerTask類是一個抽象類,該類實現了Runnable介面,所以該類具備多執行緒的能力。
在這種實現方式種,通過繼承TimerTask使該類或得多執行緒的能力,將需要多執行緒執行的程式碼書寫在run方法內部,然後通過Timer類啟動執行緒的執行。

例子:

public class TestTimer {
    public static void main(String[] args) {
        Timer t1 = new Timer();//定義計時器;
        MyTask task1 = new MyTask();//定義任務;
        t1.schedule(task1,3000);  //3秒後執行;
        //t1.schedule(task1,5000,1000);//5秒以後每隔1秒執行一次!
        //GregorianCalendar calendar1 = new GregorianCalendar(2010,0,5,14,36,57); 
        //t1.schedule(task1,calendar1.getTime()); //指定時間定時執行; 
    }
}
 
class MyTask extends TimerTask {//自定義執行緒類繼承TimerTask類;
    public void run() {
        for(int i=0;i<10;i++){
            System.out.println("任務1:"+i);
        }
    }
}