2017-09-20 2 views
0

저는 Spring을 처음 접했고 멀티 스레드 프로그램을 구현하려고합니다. 이 링크에서 봄 문서에 따라, https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html는 스레드스프링을 사용한 스레드 생성

public class TaskExecutorExample { 
    private class MessagePrinterTask implements Runnable { 
    private String message; 
    public MessagePrinterTask(String message) { 
     this.message = message; 
    } 
    public void run() { 
     System.out.println(message); 
    } 
    } 

    private TaskExecutor taskExecutor; 
    public TaskExecutorExample(TaskExecutor taskExecutor) { 
    this.taskExecutor = taskExecutor; 
    } 
    public void printMessages() { 
    for(int i = 0; i < 25; i++) { 
     taskExecutor.execute(new MessagePrinterTask("Message" + i)); 
    } 
    } 
} 

처럼 만들 수 있습니다하지만 '실'은 '새로운'키워드로 생성되고 bean은 Spring에 의해 관리되지 않습니다. 따라서 Autowired 구성 요소에 액세스 할 수 없습니다. 이 문제를 해결하려면 외부 클래스의 구성 요소를 Autowire하여 생성자의 스레드 클래스에 전달해야합니다.

그러나 스프링이 스레드 초기화를 처리하여 스레드가 모든 자동 유선 구성 요소에 액세스 할 수 있도록하는 다른 적절한 방법이 있습니다.

내가 만드는 응용 프로그램은 대기열에서받는 모든 새 메시지에 대해 새 스레드를 만들어야합니다.

답변

1

질문은 TaskExecutor를 초기화하고 사용하는 방법에 관한 것입니다.

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <property name="corePoolSize" value="5" /> 
    <property name="maxPoolSize" value="10" /> 
    <property name="queueCapacity" value="25" /> 
</bean> 

<bean id="taskExecutorExample" class="TaskExecutorExample"> 
    <constructor-arg ref="taskExecutor" /> 
</bean> 

을 또는 당신은 그럼 당신은 그것을 사용하는 @Autowired

@Bean 
    public ThreadPoolTaskExecutor threadPool() { 
     ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); 
     pool.setCorePoolSize(5); 
     pool.setMaxPoolSize(10); 
     pool.setQueueCapacity(25); 
     return pool; 
    } 

    @Bean 
    public TaskExecutorExample executorExample() { 
    return new TaskExecutorExample(threadPool()); 
    } 

같은 @Bean를 사용하여 코드에서 수행 할 수 있습니다 그래서, 워드 프로세서 그렇게 할 수있는 방법을 보여줍니다. http://www.bigsoft.co.uk/blog/index.php/2009/11/27/rules-of-a-threadpoolexecutor-pool-size

EDIT1을 : corePoolSize, maxPoolSize, queueCapacity의 세부 사항에 대해 , 당신은 여기를 참조 할 수 있습니다 후 SAMO의 설명을 가지고, 나는 그것을 업데이트 할 :

는에 @Component를 추가하여 @Scope ("프로토 타입")가있는 스레드. 그런 다음 스레드를 @Autowired 사용하고 여기에 taskExecutor.execute (sampleThread)

샘플을 실행 https://www.mkyong.com/spring/spring-and-java-thread-example/ 부 : 3. 봄 스레드 풀 + 스프링 빈 예를

희망이 도움이 있었다.

+0

안녕하세요. 내 질문은 스레드 풀에 제출할 때 스레드를 만드는 방법에 관한 것입니다. 'new Thread()'를 사용하여 생성 한 다음 스레드 풀에 제출하면 Spring은 우리가 생성 한 스레드 객체를 관리하지 않습니다. 스프링으로 관리 할 수 ​​있도록 스레드의 인스턴스를 만드는 방법. – samo

+0

'@Scope ("prototype")'을 사용하여 스레드에'@ Component'를 추가하십시오. 그럼 당신은 당신의 Thread를 @ Autowired 할 수 있고 이와 같이'taskExecutor.execute (sampleThread)'를 실행할 수 있습니다. –

+0

@samo : 샘플을 참조해야합니다. Pls 3 참조. 스프링 스레드 풀 + 봄 관리 콩 예제 : https://www.mkyong.com/spring/spring-and-java-thread-example/ –

관련 문제