在Java中处理可能手动启动的常规作业
我试图解决一个类似于通过邮件客户端从邮件服务器下载新邮件的问题。我有一个任务,它是定期执行的(例如,下一次迭代是在最后一次迭代结束后10分钟),但也有可能手动运行该任务 当我试图手动运行作业,但作业此时未运行(稍后指定)时,我会取消该预约并将其安排到现在。当作业已经运行时,我不会取消它,而是等到它完成后再运行。但只有一项任务可以这样等待 我的问题是,我不知道如何同步作业,以确保线程安全,并确保作业不会同时运行两次在Java中处理可能手动启动的常规作业,java,multithreading,synchronization,Java,Multithreading,Synchronization,我试图解决一个类似于通过邮件客户端从邮件服务器下载新邮件的问题。我有一个任务,它是定期执行的(例如,下一次迭代是在最后一次迭代结束后10分钟),但也有可能手动运行该任务 当我试图手动运行作业,但作业此时未运行(稍后指定)时,我会取消该预约并将其安排到现在。当作业已经运行时,我不会取消它,而是等到它完成后再运行。但只有一项任务可以这样等待 我的问题是,我不知道如何同步作业,以确保线程安全,并确保作业不会同时运行两次 让它更清楚。主要的问题是,仅仅询问工作是否正在运行并根据我得到的信息做出决定是不够
让它更清楚。主要的问题是,仅仅询问工作是否正在运行并根据我得到的信息做出决定是不够的,因为在问题和行动之间,情况可能会发生变化。这是一个很短的跨度,但概率不是零。同样的问题是,在他竞选结束时,我是否应该再次竞选。如果我的决定是基于某个变量或某个If子句的值,那么在测试它的值和执行某个操作之间,其他线程可以更改它,我可以得到两个计划作业,或者根本没有计划作业。您考虑过使用一个吗
要使作业现在运行,只需说服它返回
0
formgetDelay(TimeUnit)
您考虑过使用一个
要使作业现在运行,只需说服它返回
0
表单getDelay(TimeUnit)
检查的主要方法是检查、锁定,然后重复相同的检查:
public class OneQueuedThread extends Thread {
static int numberRunning =0;
public void run() {
if (numberRunning<2) {
synchronized (OneQueuedThread.class){
if (numberRunning<2) {
numberRunning++;
// ---------------your process runs here
numberRunning--;
}
}
}
}
}
执行您正在讲述的检查的主要方法是检查、锁定,然后重复相同的检查:
public class OneQueuedThread extends Thread {
static int numberRunning =0;
public void run() {
if (numberRunning<2) {
synchronized (OneQueuedThread.class){
if (numberRunning<2) {
numberRunning++;
// ---------------your process runs here
numberRunning--;
}
}
}
}
}
我不明白这有什么帮助。我可以请求获取队列的头,但在某些情况下,我可以得到null,因为getDelay返回一毫秒,当我基于此执行决策时,它将中断,因为我预计它不会运行,并运行它,导致它将运行两次。您自己编写并将其放入队列。然后您可以在外部操纵它,使其返回
0
。我不明白这有什么帮助。我可以请求获取队列的头,但在某些情况下,我可以得到null,因为getDelay返回一毫秒,当我基于此执行决策时,它将中断,因为我预计它不会运行,并运行它,导致它将运行两次。您自己编写并将其放入队列。然后,您可以在外部操纵它,使其返回0
。