2011-11-24 5 views
1

프로토 타입 범위로 스레드를 autowire 할 때 문제가 발생하는지 궁금합니다.@Autowired 및 Threads에 대한 함점

스레드 :

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

스레드 시작 클래스 :

... 
public class ThreadStarter { 

    @Autowired 
    private MyThread myThread; 

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

출발 클래스는 웹 서비스 구현에서 호출됩니다.

고려해야 할 함정이 있습니까?

답변

1

그럼 reallty는 스레드 클래스 인스턴스의 기능에 달려 있습니다.

Servlet doGet 및/또는 doPost 메소드를 생각해보십시오. 당신이 무국적 상태이고 더 넓은 범위 (세션이나 컨텍스트와 같은)에 값을 보관하지 않는다면, 언제 당신의 서블릿 인스턴스가 호출 될 지 걱정할 필요가 없다. 그러나 statefull (예 : 세션 범위에 객체 가져 오기/가져 오기)중인 경우 해당 서블릿 인스턴스의 액세스를 해당 범위 (synchronized(session))와 동기화하거나 요청이 서블릿 스레드에서 처리되는 방식을 직렬화해야합니다.

나는 여기가 거의 같은 상황이라고 생각한다. 상태에 관계없이 상태를 유지하고 스레드간에 데이터를 공유하는 경우 스레드 인스턴스가 범위를 갖도록 프로토 타입을 만들려고합니다 (따라서 삽입이 필요할 때마다 새 인스턴스가 만들어지기를 원합니다) if singleton의 기본 범위 인 if 그 thread의 run() 메소드는 그 외부의 데이터에 관해서는 상태를 유지하지 않습니다.

1

아니요, 자동 와이어 링은 어느 bean이 종속성을 수행하도록 선택되었는지에만 영향을줍니다. ApplicationContext를 간섭하지 않는 한 (즉, 빈을 동시에 추가/수정하는 경우) 이상한 일은 일어나지 않아야합니다.

예제에서 ThreadStarterMyThread의 새로운 인스턴스가 삽입 될 때마다 인스턴스화됩니다. 원하는대로하면됩니다.

관련 문제