【问题标题】:Most elegant way to secure that a thread is finished while some task got done在完成某些任务时确保线程完成的最优雅方法
【发布时间】:2020-09-26 12:37:58
【问题描述】:

所以当特定的事情发生时,我设法结束了我的线程,

但我想保护自己,以防我提到的具体事情没有发生, 所以我不会在我的线程内陷入无限循环。

所以我所做的是使用 5 分钟的计时器,以防万一,即使不满足“while”条件,该线程也会以某种方式死亡。 我是这样做的:

shouldRun = true;
doSomething();

Thread myThread = new Thread(() -> {
   long start = System.currentTimeMillis();
   long end = start + 60*1000*5;
   try {
       while (shouldRun && System.currentTimeMillis() < end) {
           if (!someCondition()) {
                doAnotherThing();
              }
        }
    } catch(Exception e) {
                logger.error("Thread has failed while running with an exception error: {} ", e);
        }
    }).start();

doTaskThatTakesOneMinuteToRun();

shouldRun = false;

上面的这个逻辑有效,但我想知道是否有更优雅/专业/正确的方法来实现我正在做的事情并通过计时结束线程,如果“while”条件是 “shouldRun”永远不会是假的,因为之前的方法被卡住了。

【问题讨论】:

    标签: java multithreading synchronization thread-safety timing


    【解决方案1】:

    如果您不需要经常运行 while 循环,可以将其替换为 for 循环并添加 Thread.sleep(millis)。这样,它将运行的时间大致是迭代次数乘以睡眠时间(如果循环中的其他操作足够快以至于可以跟踪)。没有睡眠的 for 循环似乎更不可预测。

    您也可以稍后从代码的其他部分调用Thread.interrupt() 并检查Thread.isInterrupted(),但这与更改shouldRun 的值并没有太大区别,因为您没有考虑此选项,在您的情况下可能不可行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多