FutureTest.java 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package com.examlple;
  2. import cn.hutool.core.thread.ThreadUtil;
  3. import java.util.concurrent.Future;
  4. import java.util.concurrent.atomic.AtomicBoolean;
  5. public class FutureTest {
  6. public static void main(String[] args) throws InterruptedException {
  7. var beginTime = System.currentTimeMillis();
  8. final AtomicBoolean isBegin = new AtomicBoolean(false);
  9. final AtomicBoolean isEnd = new AtomicBoolean(false);
  10. Future<String> futureTask = ThreadUtil.execAsync(() -> {
  11. Thread.sleep(3 * 1000);
  12. isBegin.set(true);
  13. Thread.sleep(7 * 1000);
  14. isEnd.set(true);
  15. return "res";
  16. });
  17. // 等待 begin,超时时间20秒
  18. while (true) {
  19. Thread.sleep(1000);
  20. System.out.println("isBegin: " + isBegin.get() + " | isEnd: " + isEnd);
  21. if (!isBegin.get()) {
  22. if ((System.currentTimeMillis() - beginTime) > 20 * 1000) {
  23. futureTask.cancel(true);
  24. break;
  25. }
  26. } else {
  27. break;
  28. }
  29. }
  30. // 如果等待到 begin,开始等待 end,重置开始时间,超时时间60秒,否则跳过
  31. if (isBegin.get()) {
  32. beginTime = System.currentTimeMillis();
  33. while (true) {
  34. Thread.sleep(1000);
  35. System.out.println("isBegin: " + isBegin.get() + " | isEnd: " + isEnd);
  36. if (!isEnd.get()) {
  37. if ((System.currentTimeMillis() - beginTime) > 60 * 1000) {
  38. futureTask.cancel(true);
  39. break;
  40. }
  41. } else {
  42. break;
  43. }
  44. }
  45. }
  46. System.out.println("最终输出 isBegin: " + isBegin.get() + " | isEnd: " + isEnd);
  47. // Future 也可以使用 get方法 指定超时时间,对于简答的任务超时控制可以直接用这种方式
  48. /*
  49. try {
  50. String res = futureTask.get(4, TimeUnit.SECONDS);
  51. System.out.println(res);
  52. } catch (InterruptedException e) {
  53. e.printStackTrace();
  54. System.out.println("中断异常");
  55. } catch (ExecutionException e) {
  56. e.printStackTrace();
  57. System.out.println("执行异常");
  58. } catch (TimeoutException e) {
  59. e.printStackTrace();
  60. System.out.println("方法执行超时");
  61. }
  62. */
  63. }
  64. }