Java中安全終止超時執行緒的方案
這裡使用JDK5+的java.util.concurrent包下的API實現,採用這種方式是相對比較安全的。
實現效果:
啟動一個子任務,然後等待子任務的計算結果同時設定一個超時時間,如果等待時間超出預設定的超時時間,則中斷子任務。
程式碼實現:
Java程式碼- import java.util.concurrent.Callable;
- import java.util.concurrent.ExecutionException;
- import java.util.concurrent.ExecutorService;
-
import java.util.concurrent.Executors;
- import java.util.concurrent.Future;
- import java.util.concurrent.TimeUnit;
- import java.util.concurrent.TimeoutException;
- /**
- * 啟動一個任務,然後等待任務的計算結果,如果等待時間超出預設定的超時時間,則中止任務。
- *
- * @author Chen Feng
- */
- public class TaskTimeoutDemo {
- public static void main(String[] args) {
-
System.out.println("Start ..."
- ExecutorService exec = Executors.newCachedThreadPool();
- testTask(exec, 15); // 任務成功結束後等待計算結果,不需要等到15秒
- testTask(exec, 5); // 只等待5秒,任務還沒結束,所以將任務中止
- exec.shutdown();
- System.out.println("End!");
- }
-
public static void testTask(ExecutorService exec, int
- MyTask task = new MyTask();
- Future<Boolean> future = exec.submit(task);
- Boolean taskResult = null;
- String failReason = null;
- try {
- // 等待計算結果,最長等待timeout秒,timeout秒後中止任務
- taskResult = future.get(timeout, TimeUnit.SECONDS);
- } catch (InterruptedException e) {
- failReason = "主執行緒在等待計算結果時被中斷!";
- } catch (ExecutionException e) {
- failReason = "主執行緒等待計算結果,但計算丟擲異常!";
- } catch (TimeoutException e) {
- failReason = "主執行緒等待計算結果超時,因此中斷任務執行緒!";
- exec.shutdownNow();
- }
- System.out.println("\ntaskResult : " + taskResult);
- System.out.println("failReason : " + failReason);
- }
- }
- class MyTask implements Callable<Boolean> {
- @Override
- public Boolean call() throws Exception {
- // 總計耗時約10秒
- for (int i = 0; i < 100L; i++) {
- Thread.sleep(100); // 睡眠0.1秒
- System.out.print('-');
- }
- return Boolean.TRUE;
- }
- }
執行結果:
Java程式碼- Start ...
- ----------------------------------------------------------------------------------------------------
- taskResult : true
- failReason : null
- ---------------------------------------------
- taskResult : null
- failReason : 主執行緒等待計算結果超時,因此中斷任務執行緒!
- 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中各種集合(字串類)的執行緒安全性!!! 一、概念: 執行緒安全:就是當多執行緒訪問時,採用了加鎖的機制;即當一個執行緒訪問該類的某個資料時,會對這個資料進行保護,其他執行緒不能對其訪問,直到該執行緒讀取完之後,其他執行緒才可以使用。防止出現數據不一致或者資料被汙染的情況。
對java中File.mkdirs方法執行緒安全問題的一點探討
mkdirs是java中用來一次建立多級目錄的方法,在java.io.File類中。 我在程式設計中遇到這樣一段程式碼: if (!dest.exists()) { dest.mkdirs(); } if (!dest.isDirectory
java 中如何避免多執行緒不安全
1.建立不可變物件 2. 執行緒封閉:把一個可變物件封裝到一個執行緒內部,或者使用ThreadLocal 3.使用volatile變數 volatile變數記憶體語義 1. 當對一個volatile變數進行寫操作的時候,JMM會把該執行緒對應的
java中final與volatile-執行緒安全問題
線上程安全問題中final主要體現在安全釋出問題上,在這裡先講一下什麼事安全釋出,在《java併發程式設計實踐》一書中有講,不過看起來挺難懂的…. public class Holder { private int n;
在JAVA中ArrayList如何保證執行緒安全
保證執行緒安全的三種方法:不要跨執行緒訪問共享變數 使共享變數是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,
Java中Callable實現多執行緒
一、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