ScheduledExecutorService 接口

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
警告!機器溫度過高。
提醒次數限制已到,禁止任務

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章