java - 在 Java 中可以手动启动来处理常规作业

标签 java multithreading synchronization

我正在尝试解决类似于通过邮件客户端从邮件服务器下载新邮件的问题。我有一个定期执行的任务(例如,下一次迭代是在上一次迭代结束后 10 分钟),但也可以手动运行该任务。

当我尝试手动运行作业并且此时作业未运行(指定为稍后运行)时,我取消预约并暂时安排它。当作业已经运行时,我不会取消它,而是等到它完成并再次运行它。但只有一个任务可以这样等待。

我的问题是我不知道如何同步作业以使其线程安全并确保该作业不会同时运行两次。

为了说得更清楚。主要问题是,简单地询问作业是否正在运行并根据我得到的信息做出决定是不够的,因为在问题和操作之间情况可能会发生变化。虽然跨度很短,但概率不为零。同样的问题是决定我是否应该在他运行结束时再次运行该作业。如果我的决定是基于某个变量或其他 if 子句的值,那么在测试其值和执行某些操作之间,其他一些线程可以更改它,我最终可能会得到两个计划的作业,或者根本没有。

最佳答案

您是否考虑过使用 DelayQueue

要让您的作业立即运行,您只需说服它返回 0 形式 getDelay(TimeUnit unit)

关于java - 在 Java 中可以手动启动来处理常规作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41564817/

相关文章:

c++ - 加入线程时出现异常

c++ - 如何停止线程并将其寄存器刷新到堆栈中?

java - 检查和控制实际并行运行的应用程序线程数

java - 关于SymmetricDS Embedded的一些问题

Java ConcurrentSkipListMap : adding atomically another Collection object

java - 如何从文本文件中读取几行到内存中?

java - 如何让java反射也采用依赖类?

java - 从 api 返回多个 order_id 的值

java - JFrame 调用多个并发线程来更新调用者 JFrame 中的 JProgressBar

java - 使用jdbc计算sql表的行数