Java 两个线程之间的上下文切换问题

Java 两个线程之间的上下文切换问题,java,multithreading,thread-safety,quartz-scheduler,Java,Multithreading,Thread Safety,Quartz Scheduler,我正在使用Quarts Scheduler进行作业调度。我有各种各样的工作,每天获取不同用户的医疗报告,并将该报告发送给各个用户。每个作业都有一个与之关联的特定用户。 在每个作业开始执行其业务逻辑之前,JobListener实现类将创建类UserJobExecution的实例 public class UserJobExecution { static ThreadLocal currentExecution = new ThreadLocal() User user;

我正在使用Quarts Scheduler进行作业调度。我有各种各样的工作,每天获取不同用户的医疗报告,并将该报告发送给各个用户。每个作业都有一个与之关联的特定用户。 在每个作业开始执行其业务逻辑之前,JobListener实现类将创建类UserJobExecution的实例

public class UserJobExecution 
{  
   static ThreadLocal currentExecution = new ThreadLocal()  
   User user;  
   static UserJobExecution getCurrent(){  
     (UserJobExecution ) currentExecution.get();  
   }  
   UserJobExecution(String jobName){  
     try  
     {  
       user = getUserFromDB(jobName);  
     }   
     catch(e)  
     {  
       e.printStackTrace();  
     }  
   }  
   User getUser(){  
      return user;  
   }  
   //rest of the code  
}  

class WebServiceUtil{  
   static HttpClient client = new HttpClient(new MultiThreadedHttpConnectionManager());  
   User user;  
   WebServiceUtil(User user){  
     this.user = user;  
   }  
   static WebServiceUtil getDefaultWs(){  
     UserJobExecution userJobExecution = UserJobExecution.getCurrent();  
     return (new WebServiceUtil(userJobExecution.getUser()));  
   }  
   static execute(String request){  
     getDefaultWs().executeService(request);  
   }  

}  
上述两个类都有一个用户对象,该对象有两个字段username和password。 每个作业都通过使用自己的用户名和密码调用其executeMethod来调用公共Web服务,以获取与特定用户关联的医疗报告。 Web服务需要时间来处理报告。因此,首先一个作业请求一个报告并获取一个报告Id,然后该作业每隔15秒连续调用webservice来检索该报告,直到webservice处理该报告,并且该作业获取该报告为止

我面临的问题是,如果同时触发多个作业,则会弄乱用户名和密码。(调用上述getCurrent()方法以获取当前正在执行的作业)

我正在为每个作业创建一个UserJobExecution实例。在执行每个作业之前,调度程序都会为其调用jobToBeExecuted方法

public class ExecutionJobListener implements JobListener {
  public void jobToBeExecuted(JobExecutionContext context){
    //Other code
    UserJobExecution userJobExecution = new UserJobExecution(job)
    userJobExecution.save()
  }
//Rest of the code
}

您似乎在为所有作业使用UserJobExecution的单个实例,这导致了一个典型的同步问题。由于所有作业在同一UserJobExecution实例中使用相同的用户属性,因此多个作业可以同时调用getUserFromDB(),并且用户属性将被覆盖


尝试构建您的类,以便所有作业不会使用作业之间共享的引用来存储getUserFromDB()的结果(例如,通过将每个作业保留为局部变量,对每个作业使用单独的引用)。

您的问题不完全清楚使用Quartz Scheduler调度的方法是什么。尽管如此,我假设错误来自于将ThreadLocal与调度器结合使用。Quartz调度程序使用内部线程池运行作业。调用作业时,您无法确定从池中的哪个线程调用它。它可以是同一个线程或任何其他线程。考虑使用JordDATAMAP来存储作业状态。我正在为每个作业创建UserJobExecution的单个实例。。我已经编辑了问题,最后添加了代码。好的,你能解释一下如何使用getDefaultWs()静态方法以及getCurrent()方法吗?他们每次都使用相同的UserJobExecution实例,这就是为什么我认为您只使用了一个。