Java 如何控制应用中的同线程干扰?

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

嗨,朋友, 我面临着当前发展中的一个关键问题。实际上,我正在使用Quartz library来计划此应用程序中的任务。我必须确定一个特定的时间来调用一个特定的方法。但有一段时间,若该方法的执行时间比已经固定的时间要长,那个么会再次调用该方法,所以我的所有处理都会重复执行。我已尝试同步关键字,但它不起作用

我正在使用代码计划我的任务-

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没有运行。“这真的是你想要的吗?”迈克尔·佩奇,谢谢你,先生。