中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中怎么處理任務超時

發布時間:2021-08-07 14:58:00 來源:億速云 閱讀:547 作者:Leah 欄目:編程語言

Java中怎么處理任務超時,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

一、基于異步任務結果的超時獲取

基于異步任務結果的獲取通常是跟線程池一起使用的,我們向線程池提交任務時會返回一個Future對象,在調用Future的get方法時,可以設置一個超時時間,如果超過設置的時間任務還沒結束,就拋出異常。接下來看代碼:

public class FutureDemo {  static ExecutorService executorService= Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*2);  public static void main(String[] args) {    Future<String> future = executorService.submit(new Callable<String>() {      @Override      public String call() {        try {          TimeUnit.SECONDS.sleep(10);        } catch (InterruptedException e) {          System.out.println("任務被中斷。");        }        return "OK";      }    });    try {      String result = future.get(2, TimeUnit.SECONDS);    } catch (InterruptedException |ExecutionException | TimeoutException e) {      future.cancel(true);      System.out.println("任務超時。");    }finally {      System.out.println("清理資源。");    }  }}

運行代碼,輸出如下:

二、使用延時任務來終止超時操作

還有一種實現任務超時處理的思路是在提交任務之前先設置一個定時器,這個定時器會在設置的時間間隔之后去取消任務。當然如果任務在規定的時間內完成了,要記得取消定時器。首先來看一下我們的工作線程:

public class RunningTask {  private volatile boolean isStop;  public void stop(){    this.isStop=true;  }  public void doing() {    int i=1;    while (!isStop){      try {        TimeUnit.SECONDS.sleep(1);      } catch (InterruptedException e) {      }    }    System.out.println("任務被中斷。");  }}

這個工作線程每隔一秒鐘會去檢查下isStop變量,因此我們可以通過isStop變量來取消任務。至于取消任務的邏輯我們放在了定時器里面,代碼如下:

public class CancelTask implements Runnable {  private RunningTask runningTask;  public CancelTask(RunningTask runningTask) {    this.runningTask = runningTask;  }  @Override  public void run() {    runningTask.stop();  }}

可以看到,該定時器的作用就是在一定的時間之后去中斷工作線程的運行。接下來測試一下:

public class ScheduleDemo {  static ScheduledExecutorService executorService= Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors()*2);  public static void main(String[] args) {    RunningTask runningTask=new RunningTask();    ScheduledFuture<?> scheduledFuture = executorService.schedule(new CancelTask(runningTask), 3, TimeUnit.SECONDS);    runningTask.doing();    if(!scheduledFuture.isDone()){      scheduledFuture.cancel(true);    }  }}

關于Java中怎么處理任務超時問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

古田县| 阿合奇县| 昭苏县| 阿鲁科尔沁旗| 个旧市| 郸城县| 巴彦县| 高平市| 塔城市| 海林市| 西藏| 桂阳县| 沙田区| 靖江市| 民丰县| 吉林市| 德阳市| 鸡泽县| 衡阳县| 安仁县| 理塘县| 永宁县| 乌拉特中旗| 长沙县| 垫江县| 万盛区| 珠海市| 寿宁县| 古交市| 滦南县| 绥德县| 小金县| 诸城市| 扶沟县| 时尚| 和田市| 随州市| 晋中市| 仁化县| 洮南市| 上林县|