Java程式執行逾時——Future介面介紹

來源:互聯網
上載者:User

標籤:com   實值型別   執行時間   cep   news   icon   todo   number   設定   

在Java中,如果需要設定代碼執行的最長時間,即逾時,可以用Java線程池ExecutorService類配合Future介面來實現。 Future介面是Java標準API的一部分,在java.util.concurrent包中。Future介面是Java線程Future模式的實 現,可以來進行非同步計算。

Future模式可以這樣來描述:我有一個任務,提交給了Future,Future替我完成這個任務。期間我自己可以去做任何想做的事情。一段時 間之後,我就便可以從Future那兒取出結果。就相當於下了一張訂貨單,一段時間後可以拿著提訂單來提貨,這期間可以幹別的任何事情。其中Future 介面就是訂貨單,真正處理訂單的是Executor類,它根據Future介面的要求來生產產品。

Future介面提供方法來檢測任務是否被執行完,等待任務執行完獲得結果,也可以設定任務執行的逾時時間。這個設定逾時的方法就是實現Java程 序執行逾時的關鍵。

Future介面是一個泛型介面,嚴格的格式應該是Future<V>,其中V代表了Future執行的任務傳回值的類型。 Future介面的方法介紹如下:

  • boolean cancel (boolean mayInterruptIfRunning) 取消任務的執行。參數指定是否立即中斷任務執行,或者等等任務結束
  • boolean isCancelled () 任務是否已經取消,任務正常完成前將其取消,則返回 true
  • boolean isDone () 任務是否已經完成。需要注意的是如果任務正常終止、異常或取消,都將返回true
  • V get () throws InterruptedException, ExecutionException  等待任務執行結束,然後獲得V類型的結果。InterruptedException 線程被中斷異常, ExecutionException任務執行異常,如果任務被取消,還會拋出CancellationException
  • V get (long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 同上面的get功能一樣,多了設定逾時時間。參數timeout指定逾時時間,uint指定時間的單位,在枚舉類TimeUnit中有相關的定義。如果計 算逾時,將拋出TimeoutException

Future的實作類別有java.util.concurrent.FutureTask<V>即 javax.swing.SwingWorker<T,V>。通常使用FutureTask來處理我們的任務。FutureTask類同時又 實現了Runnable介面,所以可以直接提交給Executor執行。使用FutureTask實現逾時執行的代碼如下:

Java代碼  
  1. ExecutorService executor = Executors.newSingleThreadExecutor();  
  2. FutureTask<String> future =  
  3.        new FutureTask<String>(new Callable<String>() {//使用Callable介面作為構造參數  
  4.          public String call() {  
  5.            //真正的任務在這裡執行,這裡的傳回值類型為String,可以為任意類型  
  6.        }});  
  7. executor.execute(future);  
  8. //在這裡可以做別的任何事情  
  9. try {  
  10.     result = future.get(5000, TimeUnit.MILLISECONDS); //取得結果,同時設定逾時執行時間為5秒。同樣可以用future.get(),不設定執行逾時時間取得結果  
  11. } catch (InterruptedException e) {  
  12.     futureTask.cancel(true);  
  13. } catch (ExecutionException e) {  
  14.     futureTask.cancel(true);  
  15. } catch (TimeoutException e) {  
  16.     futureTask.cancel(true);  
  17. } finally {  
  18.     executor.shutdown();  
  19. }  

   

 

不直接構造Future對象,也可以使用ExecutorService.submit方法來獲得Future對象,submit方法即支援以 Callable介面類型,也支援Runnable介面作為參數,具有很大的靈活性。使用樣本如下:

Java代碼  
  1. ExecutorService executor = Executors.newSingleThreadExecutor();  
  2. FutureTask<String> future = executor.submit(  
  3.    new Callable<String>() {//使用Callable介面作為構造參數  
  4.        public String call() {  
  5.       //真正的任務在這裡執行,這裡的傳回值類型為String,可以為任意類型  
  6.    }});  
  7. //在這裡可以做別的任何事情  
  8. //同上面取得結果的代碼  
  

實現Future介面:

 

[java] view plain copy 
  1. private class FutureTest<V> implements Future<V>{  
  2.   
  3.     @Override  
  4.     public boolean cancel(boolean arg0) {  
  5.         // TODO Auto-generated method stub  
  6.         return false;  
  7.     }  
  8.   
  9.     @Override  
  10.     public V get() throws InterruptedException, ExecutionException {  
  11.         // TODO Auto-generated method stub  
  12.         return null;  
  13.     }  
  14.   
  15.     @Override  
  16.     public V get(long arg0, TimeUnit arg1) throws InterruptedException,  
  17.             ExecutionException, TimeoutException {  
  18.         // TODO Auto-generated method stub  
  19.         return null;  
  20.     }  
  21.   
  22.     @Override  
  23.     public boolean isCancelled() {  
  24.         // TODO Auto-generated method stub  
  25.         return false;  
  26.     }  
  27.   
  28.     @Override  
  29.     public boolean isDone() {  
  30.         // TODO Auto-generated method stub  
  31.         return false;  
  32.     }  
  33. }  

實現Callbale介面:

 

 

[java] view plain copy 
  1. private class CallableTest<V> implements Callable<V>{  
  2.   
  3.     @Override  
  4.     public V call() throws Exception {  
  5.         // TODO Auto-generated method stub  
  6.         return null;  
  7.     }  
  8. }  

Java程式執行逾時——Future介面介紹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.