Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @Autowired和Threads的陷阱_Java_Multithreading_Spring - Fatal编程技术网

Java @Autowired和Threads的陷阱

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

我想知道当我用prototype作用域自动连接线程时是否应该检查任何问题

线程:

...
@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
实例,我希望这就是您想要的。

这实际上取决于线程类实例的功能

想想Servlet
doGet
和/或
doPost
方法。如果您是无状态的,并且没有在更大的范围(例如会话或上下文)中保留值,那么您就不必担心何时调用servlet的哪个实例。但是,如果您是状态完整的(例如,获取/放置对象到会话作用域),那么您需要同步该servlet实例对所述作用域的访问(
synchronized(session)
),或者序列化servlet线程处理请求的方式

我想你现在的处境也差不多。如果您实际上是有状态的,并且在线程之间共享数据,那么您希望将您的线程实例设置为原型范围(从而在每次需要注入时创建一个新实例),并且如果该线程的run()方法就其外部数据而言是无状态的,那么您可以将其保留为singleton的默认范围