자바 구현 작업 시간 초과 처리 방법

작업 시간 초과 처 리 는 비교적 흔히 볼 수 있 는 수요 이다.예 를 들 어 비교적 시간 이 걸 리 는 작업(예 를 들 어 네트워크 요청)을 하거나 비교적 귀중 한 자원(예 를 들 어 데이터 베이스 연결)을 점용 할 때 우 리 는 이런 작업 에 시간 초과 시간 을 설정 해 야 한다.실행 시간 이 설정 한 한도 값 을 초과 할 때 작업 을 중지 하고 자원 을 회수 해 야 한다.자바 에서 시간 초과 작업 에 대한 처 리 는 두 가지 방식 이 있 습 니 다.하 나 는 비동기 작업 결 과 를 바탕 으로 하 는 시간 초과 획득 이 고 하 나 는 시간 지연 작업 을 사용 하여 시간 초과 작업 을 중지 하 는 것 입 니 다.다음은 상세 하 게 설명 하 겠 습 니 다.
1.비동기 작업 결과 에 따 른 시간 초과 획득
비동기 작업 결 과 를 바탕 으로 얻 는 것 은 보통 스 레 드 탱크 와 함께 사용 합 니 다.우 리 는 스 레 드 탱크 에 작업 을 제출 할 때 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("    。");
    }
  }}
실행 코드,출력 은 다음 과 같 습 니 다:

2.시간 지연 작업 을 사용 하여 시간 초과 작업 을 종료 합 니 다.
또 하나의 작업 시간 초과 처 리 를 실현 하 는 사고방식 은 작업 을 제출 하기 전에 타 이 머 를 설정 하 는 것 이다.이 타 이 머 는 설 정 된 시간 간격 후에 작업 을 취소 할 것 이다.물론 임무 가 정 해진 시간 안에 완성 된다 면 타 이 머 를 취소 하 는 것 을 기억 해 야 한다.우선 우리 의 작업 라인 을 살 펴 보 자.

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("     。");
  }
}
이 작업 스 레 드 는 1 초 마다 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);
    }
  }
}
실행 결 과 는 다음 과 같 습 니 다.

미 션 이 시간 을 초과 한 후에 도 취소 되 는 것 을 볼 수 있다.
총결산
위 에서 말 한 것 은 편집장 이 여러분 에 게 소개 한 자바 의 임무 수행 시간 초과 처리 방법 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 제때에 여러분 에 게 답 할 것 입 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기