我正在尝试解决类似于通过邮件客户端从邮件服务器下载新邮件的问题。我有一个定期执行的任务(例如,下一次迭代是在上一次迭代结束后 10 分钟),但也可以手动运行该任务。
当我尝试手动运行作业并且此时作业未运行(指定为稍后运行)时,我取消预约并暂时安排它。当作业已经运行时,我不会取消它,而是等到它完成并再次运行它。但只有一个任务可以这样等待。
我的问题是我不知道如何同步作业以使其线程安全并确保该作业不会同时运行两次。
为了说得更清楚。主要问题是,简单地询问作业是否正在运行并根据我得到的信息做出决定是不够的,因为在问题和操作之间情况可能会发生变化。虽然跨度很短,但概率不为零。同样的问题是决定我是否应该在他运行结束时再次运行该作业。如果我的决定是基于某个变量或其他 if 子句的值,那么在测试其值和执行某些操作之间,其他一些线程可以更改它,我最终可能会得到两个计划的作业,或者根本没有。
最佳答案
您是否考虑过使用 DelayQueue ?
要让您的作业立即运行
,您只需说服它返回 0
形式 getDelay(TimeUnit unit)
。
关于java - 在 Java 中可以手动启动来处理常规作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41564817/