如何在应用程序中控制相同的线程干扰?

时间:2014-10-14 13:13:42

标签: java multithreading synchronization quartz-scheduler

嗨朋友,               我正面临当前发展中的一个关键问题。实际上我使用Quartz库来安排我在这个应用程序中的任务。我已经确定了一个特定的时间来调用特定的方法。但是有一段时间,如果方法比已经固定的时间花费更多的执行时间,那么这个方法再次被调用,所以我的所有处理都重复执行。我试图同步关键字,但它无法正常工作。

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

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();
   }
   } 

myWork of Vi类的方法用于在数据大小时处理某些数据,然后重复调用此函数。并且只要数据不是很大,那么就可以很好地调用这个函数。

所以

我们可以根据处理时间要求控制myWork()方法调用。我的意思是我们可以同步myWork()方法吗?这里。

请帮帮我。 感谢

1 个答案:

答案 0 :(得分:1)

如果我理解得很好,你可以在myWork()启动时设置一个标志(会话或某种上下文,数据库,它取决于你正在使用的其他东西),然后在每次执行之前检查该旗帜的状态。如果方法尚未完成其工作,则不要再次启动它。一旦完成,重置标志,当下一个预定时间到来时,它将正常执行。