最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)任務(wù)超時(shí)處理方法

 更新時(shí)間:2019年06月28日 09:55:01   作者:不才黃某  
任務(wù)超時(shí)處理是比較常見的需求,Java中對(duì)超時(shí)任務(wù)的處理有兩種方式,在文中給大家詳細(xì)介紹,本文重點(diǎn)給大家介紹Java實(shí)現(xiàn)任務(wù)超時(shí)處理方法,需要的朋友可以參考下

任務(wù)超時(shí)處理是比較常見的需求,比如在進(jìn)行一些比較耗時(shí)的操作(如網(wǎng)絡(luò)請(qǐng)求)或者在占用一些比較寶貴的資源(如數(shù)據(jù)庫連接)時(shí),我們通常需要給這些操作設(shè)置一個(gè)超時(shí)時(shí)間,當(dāng)執(zhí)行時(shí)長(zhǎng)超過設(shè)置的閾值的時(shí)候,就終止操作并回收資源。Java中對(duì)超時(shí)任務(wù)的處理有兩種方式:一種是基于異步任務(wù)結(jié)果的超時(shí)獲取,一種則是使用延時(shí)任務(wù)來終止超時(shí)操作。下文將詳細(xì)說明。

一、基于異步任務(wù)結(jié)果的超時(shí)獲取

基于異步任務(wù)結(jié)果的獲取通常是跟線程池一起使用的,我們向線程池提交任務(wù)時(shí)會(huì)返回一個(gè)Future對(duì)象,在調(diào)用Future的get方法時(shí),可以設(shè)置一個(gè)超時(shí)時(shí)間,如果超過設(shè)置的時(shí)間任務(wù)還沒結(jié)束,就拋出異常。接下來看代碼:

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("任務(wù)被中斷。");
        }
        return "OK";
      }
    });
    try {
      String result = future.get(2, TimeUnit.SECONDS);
    } catch (InterruptedException |ExecutionException | TimeoutException e) {
      future.cancel(true);
      System.out.println("任務(wù)超時(shí)。");
    }finally {
      System.out.println("清理資源。");
    }
  }}

運(yùn)行代碼,輸出如下:

二、使用延時(shí)任務(wù)來終止超時(shí)操作

還有一種實(shí)現(xiàn)任務(wù)超時(shí)處理的思路是在提交任務(wù)之前先設(shè)置一個(gè)定時(shí)器,這個(gè)定時(shí)器會(huì)在設(shè)置的時(shí)間間隔之后去取消任務(wù)。當(dāng)然如果任務(wù)在規(guī)定的時(shí)間內(nèi)完成了,要記得取消定時(shí)器。首先來看一下我們的工作線程:

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("任務(wù)被中斷。");
  }
}

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

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

可以看到,該定時(shí)器的作用就是在一定的時(shí)間之后去中斷工作線程的運(yùn)行。接下來測(cè)試一下:

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);
    }
  }
}

運(yùn)行結(jié)果如下:

可以看到,任務(wù)在超時(shí)之后也可以被取消。

總結(jié)

以上所述是小編給大家介紹的Java實(shí)現(xiàn)任務(wù)超時(shí)處理方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • 關(guān)于Idea清除緩存并重啟解決的問題

    關(guān)于Idea清除緩存并重啟解決的問題

    這篇文章主要介紹了關(guān)于Idea清除緩存并重啟解決的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Spring Security 控制授權(quán)的方法

    Spring Security 控制授權(quán)的方法

    本篇文章主要介紹了Spring Security 控制授權(quán)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • Java使用JaCoCo進(jìn)行代碼覆蓋率分析的操作指南

    Java使用JaCoCo進(jìn)行代碼覆蓋率分析的操作指南

    JaCoCo是一個(gè)開源的 Java 代碼覆蓋率工具,廣泛應(yīng)用于測(cè)試過程中,它可以幫助開發(fā)者分析測(cè)試代碼的覆蓋情況,在本文中,我們將介紹 JaCoCo 的基本功能、如何集成到 Maven 項(xiàng)目中,以及通過具體案例展示如何生成覆蓋率報(bào)告,需要的朋友可以參考下
    2025-02-02
  • servlet之session工作原理簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    servlet之session工作原理簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了servlet之session工作原理簡(jiǎn)介,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • java 抓取網(wǎng)頁內(nèi)容實(shí)現(xiàn)代碼

    java 抓取網(wǎng)頁內(nèi)容實(shí)現(xiàn)代碼

    這篇文章主要介紹了java 抓取網(wǎng)頁內(nèi)容實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-02-02
  • Spring中的HandlerMapping執(zhí)行流程詳解

    Spring中的HandlerMapping執(zhí)行流程詳解

    這篇文章主要介紹了Spring中的HandlerMapping執(zhí)行流程詳解,HandlerMapping在Spring MVC框架的jar包下面,他是處理映射器,為用戶發(fā)送的請(qǐng)求找到合適的Handler Adapter,它將會(huì)把請(qǐng)求映射為HandlerExecutionChain對(duì)象,需要的朋友可以參考下
    2023-08-08
  • Java CAS操作與Unsafe類詳解

    Java CAS操作與Unsafe類詳解

    這篇文章主要介紹了Java CAS操作與Unsafe類的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02
  • Spring?Security?基于URL的權(quán)限判斷源碼解析

    Spring?Security?基于URL的權(quán)限判斷源碼解析

    這篇文章主要介紹了Spring?Security?基于URL的權(quán)限判斷問題,我們想要實(shí)現(xiàn)自己的基于請(qǐng)求Url的授權(quán)只需自定義一個(gè)?AccessDecisionManager即可,接下來跟隨小編一起看看實(shí)現(xiàn)代碼吧
    2021-12-12
  • 使用Java實(shí)現(xiàn)Redis限流的方法

    使用Java實(shí)現(xiàn)Redis限流的方法

    限流的作用是防止某個(gè)段時(shí)間段內(nèi)的請(qǐng)求數(shù)過多,造成模塊因高并發(fā)而不可用。這篇文章給大家介紹使用Java實(shí)現(xiàn)Redis限流的相關(guān)知識(shí),一起看看吧
    2021-09-09
  • java若依框架集成redis緩存詳解

    java若依框架集成redis緩存詳解

    今天小編就為大家分享一篇關(guān)于java若依框架集成redis緩存的實(shí)現(xiàn),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2021-08-08

最新評(píng)論

永泰县| 资阳市| 茶陵县| 左贡县| 兴和县| 黄浦区| 肥城市| 齐齐哈尔市| 和林格尔县| 绥棱县| 长海县| 赤城县| 云霄县| 武强县| 渝中区| 皋兰县| 白河县| 沙田区| 游戏| 饶平县| 蒙山县| 平南县| 巴林右旗| 皮山县| 吉安市| 景德镇市| 云霄县| 丘北县| 南丹县| 科技| 柳州市| 和平县| 平潭县| 宜宾县| 凤山市| 炉霍县| 元朗区| 武川县| 江山市| 景谷| 溆浦县|