2017-09-20 13 views
0

私はSpringには新しく、マルチスレッドプログラムを実装しようとしています。このリンクで春のドキュメント、https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/scheduling.htmlあたりとして、スレッドは次のように作成することができ、Springでのスレッド作成

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が春で管理されていないで作成されます。したがって、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の詳細について 、maxPoolSizequeueCapacity、あなたに@Componentを追加

:後サモから明確化を持って、私はそれを更新したいと思います@Scope( "プロトタイプ")のスレッド。次に、あなたのスレッドを@Autowired使用し、ここでtaskExecutor.execute(sampleThread)

サンプルを実行します。https://www.mkyong.com/spring/spring-and-java-thread-example/パート:3.春のスレッドプール+春は、Bean例

・ホープこのヘルプ管理。

+0

こんにちは。私の質問は、スレッドプールにサブミットするときにスレッドを作成する方法でした。 'new Thread()'を使って新しいスレッド()を作成し、それをスレッドプールに送信すると、Springは作成したスレッドオブジェクトを管理しません。では、スレッドのインスタンスを作成して、それを春に管理する方法を説明します。 – samo

+0

@Scope( "prototype") 'でスレッドに' @ Component'を追加するだけです。次に、あなたのスレッドを '@ Autowired'して、このように' taskExecutor.execute(sampleThread) 'を実行することができます。 –

+0

@samo:まだサンプルを参照する必要があるだけです。 Pls 3を参照してください。Spring Thread Pool + Spring管理Beanの例:https://www.mkyong.com/spring/spring-and-java-thread-example/ –

関連する問題