自定义多阶段倒计时实现分段倒计时

直接贴代码好了

情况是这么个情况 老板想要一个倒计时完毕后再接下一个倒计时总共四五个算一轮业务结束的这个样子
然后循环执行这个业务,这些循环执行我就用了xxl-job ,整体业务就用信号量执行了,总的来说是返回给前端的时间是零误差的, 业务处理的都用异步去执行保证时间总的不会误差1秒

@Slf4j
@Component
@RequiredArgsConstructor
public class MultiPhaseTask extends IJobHandler {

    private final int NUMBER_OF_PHASES = 4;
    ExecutorService executor = Executors.newFixedThreadPool(1);
    private final Semaphore semaphore = new Semaphore(1);

    /**
     * 每个阶段持续时间(毫秒)
     */
    int[] phaseDurations = {5000, 35000, 5000, 5000};

    @Override
    @XxlJob(value = "xxxtask")
    public void execute() throws Exception {

        for (int i = 0; i < NUMBER_OF_PHASES; i++) {
            final int phaseIndex = i;
            int phaseDuration = phaseDurations[i];

            executor.submit(() -> {
                try {
                    // 获取信号量,保证按顺序执行
                    semaphore.acquire();
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                // 在阶段开始时调用对应的方法
                methodStart(phaseIndex + 1);
                log.info("轮次: " + (phaseIndex + 1) + " 开始");

                for (int timeLeft = phaseDuration / 1000; timeLeft > 0; timeLeft--) {
                    System.out.println("轮次: " + (phaseIndex + 1) + " - 倒计时 : " + timeLeft + " s");
                    try {
                        // 每秒更新一次倒计时
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                }

                methodEnd(phaseIndex + 1);

                System.out.println("轮次: " + (phaseIndex + 1) + " 结束");
                // 释放信号量,允许下一个阶段执行
                semaphore.release();
            });
        }

        executor.shutdown();
        // 等待所有任务完成
        boolean b = executor.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
        // 重置 executor
        executor = Executors.newFixedThreadPool(1);
    }


    private void methodStart(int phaseIndex) {
        switch (Objects.requireNonNull(GamesRoundStatusEnum.getGamesEnum(phaseIndex))) {
            case WAIT_START:
                startWait();
                break;
            case OPEN_PLAY:
                startOpen();
                break;
            case OPEN_RESULT:
                startResult();
                break;
            case RESULT_DISPLAY:
                startDisplay();
                break;
            default:
                break;
        }
    }

    private void methodEnd(int phaseIndex) {
        switch (Objects.requireNonNull(GamesRoundStatusEnum.getGamesEnum(phaseIndex))) {
            case WAIT_START:
                endWait();
                break;
            case OPEN_PLAY:
                endOpen();
                break;
            case OPEN_RESULT:
                endResult();
                break;
            case RESULT_DISPLAY:
                endDisplay();
                break;
            default:
                break;
        }
    }

相关推荐

  1. 定义阶段计时实现分段计时

    2024-04-01 20:26:02       15 阅读
  2. jquery 实现计时

    2024-04-01 20:26:02       14 阅读
  3. 如何在unity中实现计时

    2024-04-01 20:26:02       21 阅读
  4. 计时80天

    2024-04-01 20:26:02       32 阅读
  5. 计时68天

    2024-04-01 20:26:02       40 阅读
  6. 计时68天

    2024-04-01 20:26:02       43 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-01 20:26:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-01 20:26:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-01 20:26:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-01 20:26:02       18 阅读

热门阅读

  1. 1364:二叉树遍历(flist)

    2024-04-01 20:26:02       13 阅读
  2. 利用ChatGPT打造精彩的学术论文写作体验

    2024-04-01 20:26:02       18 阅读
  3. 通过多选按钮选择需要修改什么字段

    2024-04-01 20:26:02       17 阅读
  4. Qt:常见的exec()函数

    2024-04-01 20:26:02       14 阅读
  5. React组件异常捕获的解决思路

    2024-04-01 20:26:02       18 阅读
  6. HTML元信息

    2024-04-01 20:26:02       17 阅读
  7. 配置一个nginx的server, 提供获取ip的服务

    2024-04-01 20:26:02       16 阅读
  8. 标题:AI大模型学习:解放智能的未来之路

    2024-04-01 20:26:02       17 阅读
  9. 深入探秘Python生成器:揭开神秘的面纱

    2024-04-01 20:26:02       14 阅读