ホームページ >Java >&#&チュートリアル >TaskExecutor インターフェイスとタイプの概要
一TaskExecutorインターフェース
SpringのTaskExecutorインターフェースは、Java.util.concurrent.Executorインターフェースに相当します。 実際、その存在の主な理由は、スレッド プールを使用する際の Java 5 への依存を抽象化することです。 このインターフェイスにはメソッドexecute(Runnable task)が1つだけあり、スレッドプールのセマンティクスと構成に従って実行タスクを受け入れます。
TaskExecutor は元々、必要に応じて他の Spring コンポーネントにスレッド プールの抽象化を提供するために作成されました。 たとえば、ApplicationEventMulticaster コンポーネント、JMS の AbstractMessageListenerContainer、および Quartz の統合はすべて、TaskExecutor 抽象化を使用してスレッド プールを提供します。 もちろん、Bean がスレッド プールの動作を必要とする場合は、この抽象化レイヤーを使用することもできます。
二 TaskExecutor type
一部の TaskExecutor 実装は Spring ディストリビューション パッケージで事前定義されています。これらを使用すると、自分で実装する必要さえなくなります。
SimpleAsyncTaskExecutor class
この実装はスレッドを再利用しないか、呼び出されるたびに新しいスレッドを開始します。ただし、同時スレッドの合計数の制限の設定は引き続きサポートされており、同時スレッドの合計数の制限を超えると、ポジションが解放されるまで新しい呼び出しはブロックされます。実際のプールが必要な場合は、読み続けてください。
SyncTaskExecutor class
この実装は非同期には実行されません。代わりに、各呼び出しは呼び出しを開始したスレッドで実行されます。主な用途は、単純なテスト ケースなど、マルチスレッドが必要ない場合です。
ConcurrentTaskExecutorクラス
この実装は、Java 5のjava.util.concurrent.Executorクラスのラッパーです。もう 1 つの代替手段として、Executor の構成パラメータを Bean プロパティとして公開する ThreadPoolTaskExecutor クラスがあります。 ConcurrentTaskExecutor を使用する必要があることはほとんどありませんが、ThreadPoolTaskExecutor では不十分な場合は、ConcurrentTaskExecutor が別の代替手段になります。
SimpleThreadPoolTaskExecutorクラス
この実装は実際にはQuartzのSimpleThreadPoolクラスのサブクラスであり、Springのライフサイクルコールバックをリッスンします。これは、Quartz コンポーネントと非 Quartz コンポーネント間で共有する必要があるスレッド プールがある場合の一般的な使用法です。
ThreadPoolTaskExecutor class
java.util.concurrent パッケージの置き換えやダウンポートはサポートしていません。 Doug Lea と Dawid Kurzyniec の java.util.concurrent 実装は両方とも異なるパッケージ構造を使用しているため、正しく実行されません。
この実装は Java 5 環境でのみ使用できますが、この環境では最もよく使用されます。これが公開する Bean プロパティを使用して、java.util.concurrent.ThreadPoolExecutor を構成し、それを TaskExecutor にラップすることができます。 ScheduledThreadPoolExecutor などのより高度なクラスが必要な場合は、代わりに ConcurrentTaskExecutor を使用することをお勧めします。
TimerTaskExecutor class
この実装は背後の実装として TimerTask を使用します。 SyncTaskExecutor との違いは、メソッド呼び出しは別のスレッドで同期されますが、そのスレッドで実行されることです。
WorkManagerTaskExecutorクラス
CommonJはBEAとIBMが共同開発した仕様セットです。これらの仕様は Java ee 標準ではありませんが、BEA および IBM アプリケーション サーバー実装の共通標準です
この実装は、基盤となる実装として CommonJ WorkManager を使用し、Spring コンテキストで CommonJ WorkManager アプリケーションを構成するための最も重要なクラスです。 SimpleThreadPoolTaskExecutor と同様に、このクラスは WorkManager インターフェイスを実装しているため、WorkManager として直接使用できます。
TaskExcutor の 3 つの簡単な例
1 taskExcutor
package com.test;import org.springframework.core.task.TaskExecutor;public class MainExecutor { private TaskExecutor taskExecutor; public MainExecutor (TaskExecutor taskExecutor) { this.taskExecutor = taskExecutor; } public void printMessages() { for(int i = 0; i < 25; i++) { taskExecutor.execute(new MessagePrinterTask("Message" + i)); } } private class MessagePrinterTask implements Runnable { private String message; public MessagePrinterTask(String message) { this.message = message; } public void run() { System.out.println(message); } } }
2 main
package com.test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TaskTest {//本地测试,不用部署到tomcatpublic static void main(String[] args) { System.out.println("测试任务调度开始..."); ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml"); MainExecutor te = (MainExecutor)appContext.getBean("taskExecutorExample"); te.printMessages(); System.out.println("--------"); } }
3.applicationContext.xml配置
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "/spring-beans.dtd"><beans> <bean id="taskExecutorExample" class="com.test.MainExecutor"> <constructor-arg ref="taskExecutor" /> </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></beans>
以上がTaskExecutor インターフェイスとタイプの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。