用 concurrent 包控制 Java 線程的超時

jopen 11年前發布 | 19K 次閱讀 Java Java開發

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

實現效果:

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

代碼實現:

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 timeout) {
        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;
    }
}
運行結果:
Start ...
----------------------------------------------------------------------------------------------------
taskResult : true
failReason : null
-------------------------------------------------
taskResult : null
failReason : 主線程等待計算結果超時,因此中斷任務線程!
End!
來:http://www.blogjava.net/jialisoftwo/archive/2013/03/29/397156.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!