java - 确保线程在完成某些任务时完成的最优雅的方法

标签 java multithreading synchronization thread-safety timing

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

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

所以我所做的是使用 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”永远不会是假,因为之前的方法被卡住了或者什么的。

最佳答案

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

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

关于java - 确保线程在完成某些任务时完成的最优雅的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62246955/

相关文章:

string - Java/Maven无法编译简单代码

android - Android 应用程序中的 SQLite-sync 同步框架

Java线程方法与 block 同步

multithreading - Gpars withExistingPool 错误 jsr166y.ForkJoinPool 未找到

使用集合时线程安全的 C# 最佳实践(还不是并发的)

java - Spring Transaction 如果这个重复的键给出异常,但它不执行回滚(更新代码以更好地检测错误)

java - 如何将 Json String 映射到 POJO?

java - 从 codenameone OnOff 开关获取值

c# - 从其他线程更新GUI

python - Python 中的 "thread local storage"是什么,我为什么需要它?