Java @Autowired和Threads的陷阱
我想知道当我用prototype作用域自动连接线程时是否应该检查任何问题 线程:Java @Autowired和Threads的陷阱,java,multithreading,spring,Java,Multithreading,Spring,我想知道当我用prototype作用域自动连接线程时是否应该检查任何问题 线程: ... @Service @Scope("prototype") public class MyThread extends Thread { ... } 线程起始类: ... public class ThreadStarter { @Autowired private MyThread myThread; public void startThread(){ myThread.s
...
@Service
@Scope("prototype")
public class MyThread extends Thread {
...
}
线程起始类:
...
public class ThreadStarter {
@Autowired
private MyThread myThread;
public void startThread(){
myThread.start();
}
}
将从webservice实现调用起始类
有什么陷阱我应该考虑吗?没有,自动连接只会影响选择哪个bean来实现依赖关系-只要您不干预ApplicationContext(即同时添加/修改bean),就不会发生奇怪的事情
在您的示例中,
ThreadStarter
将在每次实例化时注入一个新的MyThread
实例,我希望这就是您想要的。这实际上取决于线程类实例的功能
想想ServletdoGet
和/或doPost
方法。如果您是无状态的,并且没有在更大的范围(例如会话或上下文)中保留值,那么您就不必担心何时调用servlet的哪个实例。但是,如果您是状态完整的(例如,获取/放置对象到会话作用域),那么您需要同步该servlet实例对所述作用域的访问(synchronized(session)
),或者序列化servlet线程处理请求的方式
我想你现在的处境也差不多。如果您实际上是有状态的,并且在线程之间共享数据,那么您希望将您的线程实例设置为原型范围(从而在每次需要注入时创建一个新实例),并且如果该线程的run()方法就其外部数据而言是无状态的,那么您可以将其保留为singleton的默认范围