@Autowired和Threads的陷阱

时间:2011-11-24 13:31:16

标签: java multithreading spring

当我使用原型范围自动装配线程时,我想知道是否应该考虑任何问题。

主题:

...
@Service
@Scope("prototype")
public class MyThread extends Thread {
  ...
}

线程起始类:

...
public class ThreadStarter {

  @Autowired
  private MyThread myThread;

  public void startThread(){
     myThread.start();
  }
}

将从Web服务实现中调用起始类。

我是否应该考虑任何陷阱?

2 个答案:

答案 0 :(得分:1)

不,自动装配只会影响选择哪个bean来实现依赖 - 只要你没有干预ApplicationContext(即同时添加/修改bean),就不会发生奇怪的事情。

在您的示例ThreadStarter中,每次实例化时都会注入一个MyThread的新实例 - 我希望这是你想要的。

答案 1 :(得分:1)

它的重要性取决于线程类实例的作用。

考虑Servlet doGet和/或doPost方法。如果你是无状态的并且没有将值保存在更广泛的范围内(例如会话或上下文),那么你可以毫不麻烦地告诉自己什么时候会调用你的servlet实例。但是,如果您是statefull(例如,将对象放入会话范围),那么您需要同步该servlet实例对所述范围(synchronized(session))的访问权限,或者序列化servlet线程处理请求的方式。

我想在这里你几乎处于同样的境地。您希望使您的线程实例成为原型作用域(因此每次需要注入时都会创建一个新实例)如果您是有状态的并且在线程之间共享数据,并且您可以将其保留为默认的单例范围。该线程的run()方法就其外部的数据而言是无状态的。