1. 설명
java에서 솔루션을 제공했습니다. jdk1.5에서 가져온 동시성 라이브러리의 Future 클래스는 이러한 요구를 충족할 수 있습니다. Future 클래스의 중요한 메소드는 get() 및 cancel()입니다. get()은 데이터 객체를 가져옵니다. 데이터가 로드되지 않은 경우 데이터를 가져오기 전에 차단되고 cancel()은 데이터 로드를 취소합니다. 또 다른 get(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("\n=============第{}次超时测试=============", i); Thread.sleep(6000); long start = System.currentTimeMillis(); String result = timeoutUtil.doWithTimeLimit(() -> timeoutUtil.randomSpentTime(), 5000).getOrElse("默认"); log.info("doWithTimeLimit方法实际耗时{}毫秒,结果:{}", System.currentTimeMillis() - start, result); } } }
위 내용은 Java로 시간 제한 도구 클래스를 작성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!