TimeoutTest.java 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package com.java110.job.databus;
  2. import java.util.Random;
  3. import java.util.concurrent.*;
  4. public class TimeoutTest {
  5. private static ExecutorService executorService = Executors.newSingleThreadExecutor();
  6. /*** @param args*/
  7. public static void main(String[] args) {
  8. // TODO Auto-generated method stub
  9. long start = System.currentTimeMillis();
  10. String result = timeoutMethod(5000);
  11. System.out.println("方法实际耗时:" + (System.currentTimeMillis() - start) + "毫秒");
  12. System.out.println("结果:" + result);
  13. try {
  14. Thread.sleep(8000);
  15. long start1 = System.currentTimeMillis();
  16. String result1 = timeoutMethod(5000);
  17. System.out.println("方法实际耗时:" + (System.currentTimeMillis() - start1) + "毫秒");
  18. System.out.println("结果:" + result1);
  19. executorService.shutdown();
  20. } catch (
  21. Exception e) {// TODO: handle exception
  22. }
  23. }
  24. // /*** 有超时时间的方法* @param timeout* @return*/
  25. private static String timeoutMethod(int timeout) {
  26. String result = "默认";
  27. FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() {
  28. @Override
  29. public String call() throws Exception {
  30. return unknowMethod();
  31. }
  32. });
  33. executorService.execute(futureTask);
  34. try {
  35. result = futureTask.get(timeout, TimeUnit.MILLISECONDS);
  36. } catch (InterruptedException | ExecutionException |
  37. TimeoutException e) {//e.printStackTrace();
  38. futureTask.cancel(true);
  39. result = "默认";
  40. }
  41. return result;
  42. }
  43. /*** 这个方法的耗时不确定* @return*/
  44. private static String unknowMethod() {
  45. Random random = new Random();
  46. int time = 10000;
  47. System.out.println("任务将耗时: " + time + "毫秒");
  48. try {
  49. Thread.sleep(time);
  50. } catch (Exception e) {// TODO: handle exception
  51. }
  52. return "获得方法执行后的返回值";
  53. }
  54. }