Java 如何控制应用中的同线程干扰?
嗨,朋友, 我面临着当前发展中的一个关键问题。实际上,我正在使用Quartz library来计划此应用程序中的任务。我必须确定一个特定的时间来调用一个特定的方法。但有一段时间,若该方法的执行时间比已经固定的时间要长,那个么会再次调用该方法,所以我的所有处理都会重复执行。我已尝试同步关键字,但它不起作用 我正在使用代码计划我的任务-Java 如何控制应用中的同线程干扰?,java,multithreading,synchronization,quartz-scheduler,Java,Multithreading,Synchronization,Quartz Scheduler,嗨,朋友, 我面临着当前发展中的一个关键问题。实际上,我正在使用Quartz library来计划此应用程序中的任务。我必须确定一个特定的时间来调用一个特定的方法。但有一段时间,若该方法的执行时间比已经固定的时间要长,那个么会再次调用该方法,所以我的所有处理都会重复执行。我已尝试同步关键字,但它不起作用 我正在使用代码计划我的任务- import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.Schedu
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import static org.quartz.TriggerBuilder.*;
public class BrainScheluder {
public BrainScheluder()
{
try {
// Grab the Scheduler instance from the Factory
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// Start scheduler here
scheduler.start();
// define the job and tie it to our BrainJob class
JobDetail job = newJob(BrainJob.class)
.withIdentity("job1", "group1")
.build();
// Trigger the job to run now, and then repeat every 60 seconds
Trigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(30)
.repeatForever())
.build();
// Tell quartz to schedule the job using our trigger
scheduler.scheduleJob(job, trigger);
// End scheduler here
//scheduler.shutdown();
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
import java.util.LinkedHashMap;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.my.Vi;
public class BrainJob implements Job {
Vi v = null;
public BrainJob() {
v= new Vi();
}
public synchronized void execute(JobExecutionContext context)
throws JobExecutionException
{
v.myWork();
}
}
我正在使用代码执行我的工作-
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import static org.quartz.TriggerBuilder.*;
public class BrainScheluder {
public BrainScheluder()
{
try {
// Grab the Scheduler instance from the Factory
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// Start scheduler here
scheduler.start();
// define the job and tie it to our BrainJob class
JobDetail job = newJob(BrainJob.class)
.withIdentity("job1", "group1")
.build();
// Trigger the job to run now, and then repeat every 60 seconds
Trigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(30)
.repeatForever())
.build();
// Tell quartz to schedule the job using our trigger
scheduler.scheduleJob(job, trigger);
// End scheduler here
//scheduler.shutdown();
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
import java.util.LinkedHashMap;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.my.Vi;
public class BrainJob implements Job {
Vi v = null;
public BrainJob() {
v= new Vi();
}
public synchronized void execute(JobExecutionContext context)
throws JobExecutionException
{
v.myWork();
}
}
Vi类的myWork方法用于在数据较大时处理某些数据,然后重复调用此函数。每当数据不是很大的时候,这个函数就会被很好地调用
所以
我们可以根据处理时间要求控制myWork()方法调用吗。我的意思是我们可以同步myWork()方法吗?在这里
请帮帮我。
谢谢如果我能很好地理解您,您可以在
myWork()
启动时在某处设置一个标志(会话或某种上下文、数据库,这取决于您正在使用的其他内容),然后在每次执行之前检查该标志的状态。如果这个方法还没有完成它的工作,就不要再启动它。一旦完成,重置标志,当下一个预定时间到来时,它将正常执行。您是否看过使用此注释标记Brainjob@DisallowConcurrentExecution
?请看:这个@Michael Petch,先生,我第一次使用这个库,所以我认为没有使用您描述的概念(@DisallowConcurrentExecution)。请建议我如何使用它。只是一个旁注:如果BrainScheduler的构造函数中抛出异常,唯一的指示将是打印到标准错误的堆栈跟踪。就调用代码所知,构造函数似乎已正常完成。调用代码将无法知道BrainJob没有运行。“这真的是你想要的吗?”迈克尔·佩奇,谢谢你,先生。