Javaアプリケーションでスレッド化を実装する方法を理解しようとしています。 Spring documentation のTaskExecutorセクションを見つけました=、およびThreadPoolTaskExecutorは私のニーズに合うように見えます。
ThreadPoolTaskExecutor
この実装は、Java 5環境でのみ使用できますが、その環境で最も一般的に使用されるものです。Java.util.concurrent.ThreadPoolExecutorを構成するためのBeanプロパティを公開し、ラップしますTaskExecutor:ScheduledThreadPoolExecutorなどの高度なものが必要な場合は、代わりにConcurrentTaskExecutorを使用することをお勧めします。
しかし、私はそれをどのように使用するのか分かりません。私は幸運なしで今しばらくの間良い例を探してきました。誰かが私を助けることができれば、私はそれを感謝します。
とても簡単です。考え方は、Beanであるexecutorオブジェクトがあり、新しいタスクを(新しいスレッドで)起動するオブジェクトに渡されるということです。良い点は、Springの設定を変更するだけで、使用するタスクエグゼキューターの種類を変更できることです。以下の例では、いくつかのサンプルクラス(ClassWithMethodToFire)を使用し、それをRunnableオブジェクトにラップして火災を発生させています。実際に独自のクラスでRunnableを実装し、executeメソッドでclassWithMethodToFire.run()
を呼び出すこともできます。
これは非常に簡単な例です。
public class SomethingThatShouldHappenInAThread {
private TaskExecutor taskExecutor;
private ClassWithMethodToFire classWithMethodToFire;
public SomethingThatShouldHappenInAThread(TaskExecutor taskExecutor,
ClassWithMethodToFire classWithMethodToFire) {
this.taskExecutor = taskExecutor;
this.classWithMethodToFire = classWithMethodToFire;
}
public void fire(final SomeParameterClass parameter) {
taskExecutor.execute( new Runnable() {
public void run() {
classWithMethodToFire.doSomething( parameter );
}
});
}
}
次に、Spring Beanを示します。
<bean name="somethingThatShouldHappenInAThread" class="package.name.SomethingThatShouldHappenInAThread">
<constructor-arg type="org.springframework.core.task.TaskExecutor" ref="taskExecutor" />
<constructor-arg type="package.name.ClassWithMethodToFire" ref="classWithMethodToFireBean"/>
</bean>
<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>