newScheduledThreadPool() 或者newSingleThreadScheduled-Executor()方法:延遲執行、週期性執行的執行器
如果想在某一段時間之後執行線程操作,或者週期性地重複執行線程操作,則可以使用工廠類Executors的newScheduledThreadPool()方法或者 newSingleThreadScheduled-Executor()方法。
newScheduledThreadPool()方法使用給定數目的線程來調度執行任務,而newSingleThreadScheduledExecutor()方法在一個單獨的線程中調度任務。
這兩個方法都將返回一個ScheduledExecutorService線程池對象。
ScheduledExecutorService接口
ScheduledExecutorService接口從ExecutorService接口繼承而來,可用於在給定的延遲後運行的某個任務,或者週期性的執行某個任務。
schedule()方法用於創建並執行給定的延遲的任務,返回的ScheduledFuture對象可以取消執行,或檢查執行狀態。scheduleAtFixedRate 和scheduleWithFixedDelay用於創建並執行一個週期性或者
固定延遲任務,直到任務取消。
在schedule()方法中,延遲時間一般大於0,但也允許取值爲0或者負數(非週期性執行),在這種情況下,認爲是立刻執行。
TimeUnit 用於指明時間單位,時間都是相對的時間,而不是絕對的時間。例如,在某一個日期之後運行,則可以使用下面的語句。
scheduled(commad,date.getTime() -System.currentTimeMills,TimeUnit.MILLISECONDS)
ScheduledFuture接口
ScheduledExecutorService接口的4個方法都將返回ScheduledFuture對象,ScheduledFuture也是一個接口,他從Delay和Future接口繼承而來,表示一個延遲的、結果可接受的操作。
該接口的getDelay方法用於獲得延遲時間,get()方法用於獲得操作結果,cancel()方法用於取消一個任務。
demo 示例:
監控一個設備的工作溫度,當溫度超過10°C後,每隔1s發出一次警告,如果連續發出10報警後,仍沒有處理,則停止設備運行。
分析 :設置兩個線程,一個線程表示設備運行。一個線程監視設備運行,採用ScheduleAtFixedRate()方法來調度,當設備警告10次,採用取消cancel()或者shutdown()方法關閉設備。
//設備線程類
public class Machine implements Runnable{
int temperature;
Machine(int temperature){
this.temperature = temperature;
}
public void run(){
perform();
temperature++;
System.out.println("機器的工作溫度在升高,當前的溫度:"+temperature);
}
private void perform(){
int temp = (int)(Math.random()*Integer.MAX_VALUE);
int sum = 0;
for(int i=0;i<temp;i++){
sum += i;
}
}
private int getTemperature(){
return temperature;
}
}
//監控設備線程類
public class Monitor implements Runnable{
Machine machine;
ScheduledExecutorService scheduler;
static int n = 0;
Monitor(Machine machine,ScheduledExecutorService scheduler){
this.machine = machine;
this.scheduler = scheduler;
}
public void run(){
if(machine.temperature>=10){
System.out.println("警告!機器溫度過高。");
n++;
}
if(n>10){
System.out.println("提醒次數限制已到,禁止任務");
scheduler.shutdown();
}
}
}
//測試啓動類
public class Index{
public static void main(String[] args){
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
Machine machine = new Machine(0);
Monitor monitor = new Monitor(machine,scheduler);
scheduler.scheduleAtFixedRate(machine,1,2,TimeUnit.SECONDS);
scheduler.scheduleAtFixedRate(monitor,0,1,TimeUnit.SECONDS);
}
}
運行結果:
機器的工作溫度在升高,當前的溫度:1
機器的工作溫度在升高,當前的溫度:2
機器的工作溫度在升高,當前的溫度:3
機器的工作溫度在升高,當前的溫度:4
機器的工作溫度在升高,當前的溫度:5
機器的工作溫度在升高,當前的溫度:6
機器的工作溫度在升高,當前的溫度:7
機器的工作溫度在升高,當前的溫度:8
機器的工作溫度在升高,當前的溫度:9
機器的工作溫度在升高,當前的溫度:10
警告!機器溫度過高。
警告!機器溫度過高。
機器的工作溫度在升高,當前的溫度:11
警告!機器溫度過高。
警告!機器溫度過高。
機器的工作溫度在升高,當前的溫度:12
警告!機器溫度過高。
警告!機器溫度過高。
機器的工作溫度在升高,當前的溫度:13
警告!機器溫度過高。
警告!機器溫度過高。
機器的工作溫度在升高,當前的溫度:14
警告!機器溫度過高。
警告!機器溫度過高。
機器的工作溫度在升高,當前的溫度:15
警告!機器溫度過高。
提醒次數限制已到,禁止任務