91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Java實現任務超時處理方法

發布時間:2020-09-19 15:26:56 來源:腳本之家 閱讀:211 作者:不才黃某 欄目:編程語言

任務超時處理是比較常見的需求,比如在進行一些比較耗時的操作(如網絡請求)或者在占用一些比較寶貴的資源(如數據庫連接)時,我們通常需要給這些操作設置一個超時時間,當執行時長超過設置的閾值的時候,就終止操作并回收資源。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("清理資源。");
    }
  }}

運行代碼,輸出如下:

Java實現任務超時處理方法

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

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

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實現任務超時處理方法

可以看到,任務在超時之后也可以被取消。

總結

以上所述是小編給大家介紹的Java實現任務超時處理方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

向AI問一下細節

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

AI

娱乐| 阿克陶县| 龙门县| 卢湾区| 五家渠市| 沈阳市| 巴东县| 枞阳县| 邓州市| 湖南省| 昭平县| 辰溪县| 重庆市| 广汉市| 德江县| 苍溪县| 玛纳斯县| 扎鲁特旗| 平顺县| 通化县| 万载县| 宜兰县| 沅陵县| 加查县| 绥德县| 大余县| 南华县| 乌苏市| 墨竹工卡县| 平舆县| 逊克县| 樟树市| 北流市| 融水| 青海省| 平遥县| 天祝| 商洛市| 罗甸县| 祁门县| 北宁市|