1. 程式人生 > >Java中安全終止超時執行緒的方案

Java中安全終止超時執行緒的方案

這裡使用JDK5+的java.util.concurrent包下的API實現,採用這種方式是相對比較安全的。

實現效果:

啟動一個子任務,然後等待子任務的計算結果同時設定一個超時時間,如果等待時間超出預設定的超時時間,則中斷子任務。

程式碼實現:

Java程式碼  收藏程式碼
  1. import java.util.concurrent.Callable;  
  2. import java.util.concurrent.ExecutionException;  
  3. import java.util.concurrent.ExecutorService;  
  4. import java.util.concurrent.Executors;  
  5. import java.util.concurrent.Future;  
  6. import java.util.concurrent.TimeUnit;  
  7. import java.util.concurrent.TimeoutException;  
  8. /** 
  9.  * 啟動一個任務,然後等待任務的計算結果,如果等待時間超出預設定的超時時間,則中止任務。 
  10.  *  
  11.  * @author Chen Feng 
  12.  */  
  13. public class TaskTimeoutDemo {  
  14.     public static void main(String[] args) {  
  15.         System.out.println("Start ..."
    );  
  16.         ExecutorService exec = Executors.newCachedThreadPool();  
  17.         testTask(exec, 15); // 任務成功結束後等待計算結果,不需要等到15秒  
  18.         testTask(exec, 5); // 只等待5秒,任務還沒結束,所以將任務中止  
  19.         exec.shutdown();  
  20.         System.out.println("End!");  
  21.     }  
  22.     public static void testTask(ExecutorService exec, int
     timeout) {  
  23.         MyTask task = new MyTask();  
  24.         Future<Boolean> future = exec.submit(task);  
  25.         Boolean taskResult = null;  
  26.         String failReason = null;  
  27.         try {  
  28.             // 等待計算結果,最長等待timeout秒,timeout秒後中止任務  
  29.             taskResult = future.get(timeout, TimeUnit.SECONDS);  
  30.         } catch (InterruptedException e) {  
  31.             failReason = "主執行緒在等待計算結果時被中斷!";  
  32.         } catch (ExecutionException e) {  
  33.             failReason = "主執行緒等待計算結果,但計算丟擲異常!";  
  34.         } catch (TimeoutException e) {  
  35.             failReason = "主執行緒等待計算結果超時,因此中斷任務執行緒!";  
  36.             exec.shutdownNow();  
  37.         }  
  38.         System.out.println("\ntaskResult : " + taskResult);  
  39.         System.out.println("failReason : " + failReason);  
  40.     }  
  41. }  
  42. class MyTask implements Callable<Boolean> {  
  43.     @Override  
  44.     public Boolean call() throws Exception {  
  45.         // 總計耗時約10秒  
  46.         for (int i = 0; i < 100L; i++) {  
  47.             Thread.sleep(100); // 睡眠0.1秒  
  48.             System.out.print('-');  
  49.         }  
  50.         return Boolean.TRUE;  
  51.     }  
  52. }  

執行結果:

Java程式碼  收藏程式碼
  1. Start ...  
  2. ----------------------------------------------------------------------------------------------------  
  3. taskResult : true  
  4. failReason : null  
  5. ---------------------------------------------  
  6. taskResult : null  
  7. failReason : 主執行緒等待計算結果超時,因此中斷任務執行緒!  
  8. End!  

相關推薦

Java安全終止超時執行方案

這裡使用JDK5+的java.util.concurrent包下的API實現,採用這種方式是相對比較安全的。 實現效果: 啟動一個子任務,然後等待子任務的計算結果同時設定一個超時時間,如果等待時間超出預設定的超時時間,則中斷子任務。 程式碼實現: Java程

關於java怎麼終止一個執行執行

其實現在要對一個迴圈執行的執行緒關閉,對迴圈執行體設定執行標誌是常見的方法。另外一種方法是使用interrupt方法中斷執行緒方式關閉執行緒。 使用interrupt方法中斷執行緒來退出執行緒 sleep wait io阻塞的情況下,對於這種執行緒退出的

java為什麼Hashtable是執行安全的,而HashMap是執行安全的?還有ArrayList為什麼是執行安全的,Vector是執行安全的??

文章目錄 一、HashMap解析 二、Hashtable解析 三、Collections.synchronizedMap()解析 四、ConcurrentHashMap 六、ArrayList為什麼是執行緒不安全的,Vector是執行緒安全的?

java那些類是執行安全的?

Java中各種集合(字串類)的執行緒安全性!!!   一、概念: 執行緒安全:就是當多執行緒訪問時,採用了加鎖的機制;即當一個執行緒訪問該類的某個資料時,會對這個資料進行保護,其他執行緒不能對其訪問,直到該執行緒讀取完之後,其他執行緒才可以使用。防止出現數據不一致或者資料被汙染的情況。

javaFile.mkdirs方法執行安全問題的一點探討

mkdirs是java中用來一次建立多級目錄的方法,在java.io.File類中。 我在程式設計中遇到這樣一段程式碼:    if (!dest.exists()) {        dest.mkdirs();    }    if (!dest.isDirectory

java 如何避免多執行安全

1.建立不可變物件 2. 執行緒封閉:把一個可變物件封裝到一個執行緒內部,或者使用ThreadLocal 3.使用volatile變數 volatile變數記憶體語義 1. 當對一個volatile變數進行寫操作的時候,JMM會把該執行緒對應的

javafinal與volatile-執行安全問題

線上程安全問題中final主要體現在安全釋出問題上,在這裡先講一下什麼事安全釋出,在《java併發程式設計實踐》一書中有講,不過看起來挺難懂的…. public class Holder { private int n;

JAVAArrayList如何保證執行安全

保證執行緒安全的三種方法:不要跨執行緒訪問共享變數 使共享變數是final型別的 將共享變數的操作加上同步 一開始就將類設計成執行緒安全的, 比在後期重新修復它,更容易. 編寫多執行緒程式, 首先保證它是正確的, 其次再考慮效能. 無狀態或只讀物件永遠是執行緒安全的.

java開啟一個新執行

//實現方法pubRmRecordByRmPlanId @Override public OperateResult pubRmRecordByRmPlanId(Long rmPlanId,String taskBeginDate,UserInfo userInfo) { ...

Java建立和啟動執行的兩種方式

方式1:繼承Thread類 步驟: 1):定義一個類A繼承於java.lang.Thread類. 2):在A類中覆蓋Thread類中的run方法. 3):我們在run方法中編寫需要執行的操作:run方法裡的程式碼,執行緒執行體. 4):在main方法(執行緒)中,建

淺析Java的四種執行

1.使用執行緒池的好處    2.JUC中幾種常用的執行緒池 java.util.concurrent包下的Executors工廠類,提供了一系列的執行緒池的建立方法,其構造方法如下: public ThreadPoolExecutor(int corePoolSize,   

JavaCallable實現多執行

一、Runnable和Callable< V >原始碼 先回顧一下Runnable和Callable< V >原始碼吧; //Runnable 原始碼 @FunctionalInterface public interface R

Java兩種多執行實現方式的區別

在程式開發中用到多執行緒,正統的方法是使用Runnable介面,相比繼承Thread類,Runnable介面有以下兩點好處: 1、避免單繼承機制的侷限,一個類可以實現多個介面 2、適用於資源的共享 下面以買票程式為例,分析繼承Thread類和實現Runnable介面的不同;

java,多個執行同時呼叫同一個靜態方法的問題

我的原來程式是這樣設計的,對於一些常用的方法,都用靜態方法來實現,在多執行緒程式中直接呼叫,靜態方法由於沒有使用靜態變數,所以沒有進行執行緒同步。 類似以下程式: class ThreadI { public static void main(String[] arg) {

JAVA執行入門(二):JAVA如何寫多執行

第一種方式:繼承Thread 步驟: 1.建立執行緒類,繼承自Thread + 重寫run,run中寫執行緒體,執行緒體就是mian()函式裡面的寫法 2.使用執行緒: 2.1 建立執行緒物件 2.2 執行緒物件.start() 步驟展示: 1. public

Java什麼方法導致執行阻塞

一、為什麼引入執行緒阻塞機制?為了解決對共享儲存區的訪問衝突,Java 引入了同步機制,現在讓我們來考察多個執行緒對共享資源的訪問,顯然同步機制已經不夠了,因為在任意時刻所要求的資源不一定已經準備好了被訪問,反過來,同一時刻準備好了的資源也可能不止一個。為了解決這種情況下的訪

Java的Socket.、執行和HaspMap的使用

Java中的Socket.、執行緒和HaspMap的使用 程式的功能:實現多人聊天 關鍵技術點說明:伺服器將每個客戶端的執行緒儲存在hashmap中,這樣就能實現資料正確轉發到哪個視窗。客戶端這邊將連線伺服器的執行緒也儲存起來,同時還要儲存執行緒對應的聊天介面,這樣通過讀

Java執行面試題(01) Java如何檢查一個執行是否擁特定物件的鎖

本文為本博主翻譯,未經允許,嚴禁轉載 簡介 考慮一個場景,在執行時你必須確認一個Java執行緒是否持有特定物件的鎖,例如,確認NewsReader執行緒是否持有NewsPaper物件的鎖?如果這個問題出現在任何核心的Java面試中,那麼我會自動假設可能有至少兩個答案,一個是

關於Java的程序和執行的理解

程式:一段靜態的程式碼,一組指令的有序集合,它本身沒有任何執行的含義,它只是一個靜態的實體,是應用軟體執行的藍本。程序:是程式的一次動態執行,它對應著從程式碼載入,執行至執行完畢的一個完整的過程,是一個動態的實體,它有自己的生命         週期。它因建立而產生,因排程而執行,因等待資源或事件而被處於等待

java執行安全和非執行安全的集合

  執行緒安全 非執行緒安全 Collection Vector ArrayList、LinkedList   H