代码分享多线程实现两个重复执行的任务并在特定时间停止它们

28

主题

184

回帖

581

积分

管理员

积分
581
  1. let 任务进行中 = true; // 控制任务是否继续执行

  2. function 任务一() {
  3.     console.log("准备执行任务一");

  4.     setTimeout(function 执行任务一() {
  5.         if (!任务进行中) return; // 如果任务已停止,直接返回

  6.         console.log("任务一执行");
  7.         // 再次调用,每五秒执行一次
  8.         setTimeout(执行任务一, 5000);
  9.     }, 5000);
  10. }

  11. function 任务二() {
  12.     console.log("准备执行任务二");

  13.     setTimeout(function 执行任务二() {
  14.         if (!任务进行中) return; // 如果任务已停止,直接返回

  15.         console.log("任务二执行");
  16.         // 再次调用,每五秒执行一次
  17.         setTimeout(执行任务二, 5000);
  18.     }, 5000);
  19. }

  20. function 倒计时(seconds) {
  21.     const countdown = setInterval(function() {
  22.         if (seconds > 0) {
  23.             console.log(seconds);
  24.             seconds--;
  25.         } else {
  26.             clearInterval(countdown);
  27.             任务进行中 = false; // 停止所有任务
  28.             console.log("已到12:58,停止所有任务。");
  29.         }
  30.     }, 1000);
  31. }

  32. function 检查停止时间() {
  33.     const now = new Date();
  34.     if (now.getHours() === 13 && now.getMinutes() === 04) {
  35.         倒计时(5); // 开始5秒倒计时
  36.     }
  37. }

  38. // 启动任务
  39. 任务一();
  40. 任务二();

  41. // 每分钟检查一次是否达到13:04
  42. setInterval(检查停止时间, 60000);
复制代码

举报 回复

28

主题

184

回帖

581

积分

管理员

积分
581

我们逐步解析这段代码的每个部分,以帮助你更清晰地理解其功能和结构。

1. 全局变量

let 任务进行中 = true; // 控制任务是否继续执行

CopyInsert

  • 作用:这个变量用于控制两个任务的执行状态。初始设为 true,表示任务可以继续执行。

2. 任务一

function 任务一() {
    console.log("准备执行任务一");

    setTimeout(function 执行任务一() {
        if (!任务进行中) return; // 如果任务已停止,直接返回

        console.log("任务一执行");
        // 再次调用,每五秒执行一次
        setTimeout(执行任务一, 5000);
    }, 5000);
}

CopyInsert

  • 准备执行:首先打印出准备执行任务一的日志。
  • 定时器:使用 setTimeout 创建一个定时器,设定 5 秒后执行内部的匿名函数(执行任务一)。
  • 状态检查:在内部函数中首先检查 任务进行中 的状态,如果为 false,则不再执行后续的代码,直接返回。
  • 执行任务:如果状态允许,打印 “任务一执行” 的日志,并再次调用 setTimeout,使任务一每 5 秒执行一次。

3. 任务二

function 任务二() {
    console.log("准备执行任务二");

    setTimeout(function 执行任务二() {
        if (!任务进行中) return; // 如果任务已停止,直接返回

        console.log("任务二执行");
        // 再次调用,每五秒执行一次
        setTimeout(执行任务二, 5000);
    }, 5000);
}

CopyInsert

  • 逻辑与任务一相同:该函数的结构和任务一类似,只是函数体中的日志和调用不同,表示执行任务二。

4. 倒计时函数

function 倒计时(seconds) {
    const countdown = setInterval(function() {
        if (seconds > 0) {
            console.log(seconds);
            seconds--;
        } else {
            clearInterval(countdown);
            任务进行中 = false; // 停止所有任务
            console.log("已到12:58,停止所有任务。");
        }
    }, 1000);
}

CopyInsert

  • 定时器:使用 setInterval 创建一个每秒执行一次的计时器。
  • 打印倒计时:如果 seconds 大于 0,打印当前的秒数,并减少秒数。
  • 停止任务:当秒数减到 0 时,使用 clearInterval 停止倒计时,并将 任务进行中 变量设置为 false,以停止所有正在执行的任务,同时打印停止任务的消息。

5. 检查停止时间函数

function 检查停止时间() {
    const now = new Date();
    if (now.getHours() === 13 && now.getMinutes() === 4) {
        倒计时(5); // 开始5秒倒计时
    }
}

CopyInsert

  • 获取当前时间:创建一个新的 Date 对象以获取当前时间。
  • 检查条件:检查当前时间是否为 13:04。如果是,则调用 倒计时 函数,开始倒计时 5 秒。

6. 启动任务

任务一();
任务二();

CopyInsert

  • 调用任务:直接调用 任务一() 和 任务二(),开始这两个定时任务。

7. 定时检查

setInterval(检查停止时间, 60000);

CopyInsert

  • 频率:使用 setInterval 每 60 秒执行一次 检查停止时间 函数,检查当前时间是否达到了停止条件。

总结

  • 该代码实现了两个任务,每 5 秒执行一次并持续监控时间。
  • 如果时间到达特定点(13:04),将开始 5 秒的倒计时,倒计时结束后停止所有任务。
  • 可以通过修改时间检测函数中的条件,调整任务停止的时间。

举报 回复