자바 시간 초과 도구 클래스 인 스 턴 스 설명 작성

우 리 는 개발 과정 에서 시간 조작 을 할 때 정 해진 시간 안에 처 리 를 마치 면 정확 한 결과 로 돌아 갈 수 있다.그렇지 않 으 면 시간 초과 임무 로 여 겨 진다.이때 우 리 는 더 이상(더 이상 실행 하지 않 음)시간 조작 을 기다 리 지 않 고 호출 자 에 게 이 임 무 를 전달 하 는 데 시간 이 필요 하고 취소 되 었 다.
1.설명
자바 는 이미 우리 에 게 해결 방법 을 제공 했다.jdk 1.5 가 가 져 온 병렬 라 이브 러 리 Future 류 는 이러한 수 요 를 만족 시 킬 수 있 습 니 다.Future 클래스 에서 중요 한 방법 은 get()과 cancel()이 있 습 니 다.get()데이터 대상 을 가 져 옵 니 다.데이터 가 불 러 오지 않 으 면 데 이 터 를 가 져 오기 전에 막 히 고 cancel()은 데이터 로드 를 취소 합 니 다.또 다른 get(timeout)작업 은 timeout 시간 내 에 얻 지 못 하면 실패 하고 돌아 와 막 히 지 않 는 다 는 것 을 보 여 준다.
범용 과 함수 식 인 터 페 이 스 를 이용 하여 도구 류 를 작성 하면 시간 초과 처 리 를 더욱 편리 하 게 할 수 있 으 며,여기저기 코드 를 쓰 지 않 아 도 된다.
2.실례

/**
 * TimeoutUtil <br>
 *
 * @author lys
 * @date 2021/2/25
 */

@Slf4j
@Component
@NoArgsConstructor
public class TimeoutUtil {
 private ExecutorService executorService;
 public TimeoutUtil(ExecutorService executorService) {
   this.executorService = executorService;
 }

 /**
  *         
  *
  * @param bizSupplier     
  * @param timeout       ,ms
  * @return    
  */
 public <R> Result<R> doWithTimeLimit(Supplier<R> bizSupplier, int timeout) {
   return doWithTimeLimit(bizSupplier, null, timeout);
 }

 /**
  *         
  *
  * @param bizSupplier      
  * @param defaultResult    
  * @param timeout        ,ms
  * @return    
  */
 public <R> Result<R> doWithTimeLimit(Supplier<R> bizSupplier, R defaultResult, int timeout) {

   R result;
   String errMsg = "Null value";
   FutureTask<R> futureTask = new FutureTask<>(bizSupplier::get);
   executorService.execute(futureTask);
   try {
     result = futureTask.get(timeout, TimeUnit.MILLISECONDS);
   } catch (InterruptedException | ExecutionException | TimeoutException e) {
     errMsg = String.format("doWithTimeLimit    %d  ,    ", timeout);
     log.error(errMsg, e);
     futureTask.cancel(true);
     result = defaultResult;
   }
   return of(result, errMsg);
 }

 /**
  *          
  */
 private String randomSpentTime() {
   Random random = new Random();
   int time = (random.nextInt(10) + 1) * 1000;
   log.info("  randomSpentTime       : " + time + "  ");
   try {
     Thread.sleep(time);
   } catch (Exception e) {
   }
   return "randomSpentTime --> " + time;
 }

 public static void main(String[] args) throws Exception {
   ExecutorService executorService = new ThreadPoolExecutor(1, 1,
       0L, TimeUnit.MILLISECONDS,
       new LinkedBlockingQueue<Runnable>(),
       runnable -> {
         Thread thread = new Thread(runnable);
         //          
         thread.setDaemon(true);
         return thread;
       });
   TimeoutUtil timeoutUtil = new TimeoutUtil(executorService);
   for (int i = 1; i <= 10; i++) {
     log.info("
============= {} =============", i); Thread.sleep(6000); long start = System.currentTimeMillis(); String result = timeoutUtil.doWithTimeLimit(() -> timeoutUtil.randomSpentTime(), 5000).getOrElse(" "); log.info("doWithTimeLimit {} , :{}", System.currentTimeMillis() - start, result); } } }
인 스 턴 스 지식 포인트 확장:
속성 검사 도구 클래스

/**
   *         。     null,   。        (     ),   。
   * @author mex
   * @date 2019 4 18 
   * @param e   
   * @param fieldNames       
   * @return void
   * @throws Exception
   */
  public static <E> void validateAttr(E e, String[] fieldNames) throws Exception {
    if (null == e) {
      throw new Exception("      ");
    }
    if (null == fieldNames) {
      return;
    }
    for (int i = 0; i < fieldNames.length; i++) {
      String fieldName = fieldNames[i];
      Field field = e.getClass().getDeclaredField(fieldName);
      String typeName = field.getGenericType().getTypeName();
      field.setAccessible(Boolean.TRUE);
      Object fieldValue = field.get(e);
      //       null   
      if (null == fieldValue) {
        throw new Exception("    :" + fieldName + "    ");
      }
      //          ,           
      if ("java.lang.String".equals(typeName)) {
        if (StringUtils.isBlank((String)fieldValue)) {
          throw new Exception("    :" + fieldName + "    ");
        }
      }
    }
  }
자바 가 시간 초과 도구 류 인 스 턴 스 를 작성 하 는 것 에 대한 설명 은 여기까지 입 니 다.더 많은 자바 가 시간 초과 도구 류 를 작성 하 는 것 에 대해 서 는 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

좋은 웹페이지 즐겨찾기