インターフェース ManagedThreadFactory
- すべてのスーパーインターフェース:
ForkJoinPool.ForkJoinWorkerThreadFactorySE
,ThreadFactorySE
public interface ManagedThreadFactory extends ThreadFactorySE, ForkJoinPool.ForkJoinWorkerThreadFactorySE
ThreadFactory
の管理可能なバージョン。ManagedThreadFactory は Java™ を継承します。SE ThreadFactory は、Jakarta™ EE 環境で実行するスレッドを作成する方法を提供します。ManagedThreadFactory の実装は、Jakarta EE Product Provider によって提供されます。アプリケーションコンポーネントプロバイダーは、Java ネーミングおよびディレクトリインターフェースを使用します。™ (JNDI)リソース環境参照を使用して、1 つ以上の ManagedThreadFactory オブジェクトのインスタンスを検索します。
Jakarta Concurrency 仕様には、ManagedThreadFactory が実装できるいくつかの動作が記述されています。アプリケーションコンポーネントプロバイダーとデプロイヤーは、これらの要件を特定し、リソース環境参照を適切にマッピングします。
newThread()
メソッドから返されるスレッドは、ManageableThread
インターフェースを実装する必要があります。ThreadFactory.newThread(Runnable)
SE メソッドを使用して新しいスレッドに割り当てられた Runnable タスクは、この ManagedThreadFactory インスタンスを作成(ルックアップ)したコンポーネントインスタンスのアプリケーションコンポーネントコンテキストで実行されます。ForkJoinPool.ForkJoinWorkerThreadFactory.newThread(ForkJoinPool)
SE メソッドによって作成されたForkJoinWorkerThread
SE は、この ManagedThreadFactory インスタンスを作成 (ルックアップ) したコンポーネントインスタンスのアプリケーションコンポーネントコンテキストでタスクを実行します。Jakarta EE Product Provider は、ForkJoinWorkerThread
ごとに 1 回コンテキストを確立し、ForkJoinWorkerThread
SE で実行される操作間でコンテキストをリセットしません。タスクは明示的なトランザクションなしで実行されます(アプリケーションコンポーネントのトランザクションには参加しません)。トランザクションが必要な場合は、
jakarta.transaction.UserTransaction
インスタンスを使用してください。UserTransaction インスタンスは、" java:comp/UserTransaction" という名前を使用して JNDI で使用できます。例:
public run() { // Begin of task InitialContext ctx = new InitialContext(); UserTransaction ut = (UserTransaction) ctx.lookup("java:comp/UserTransaction"); ut.begin(); // Perform transactional business logic ut.commit(); }
ManagedThreadFactory は、Java SE ExecutorService 実装で直接使用できます。例:
/** * Create a ThreadPoolExecutor using a ManagedThreadFactory. * Resource Mappings: * type: jakarta.enterprise.concurrent.ManagedThreadFactory * jndi-name: concurrent/tf/DefaultThreadFactory */ @Resource(name="concurrent/tf/DefaultThreadFactory") ManagedThreadFactory tf; public ExecutorService getManagedThreadPool() { // All threads will run as part of this application component. return new ThreadPoolExecutor(5, 10, 5, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10), tf); }
ForkJoinPool 例:
ManagedThreadFactory threadFactory = InitialContext.doLookup("java:comp/DefaultManagedThreadFactory"); ForkJoinPool pool = new ForkJoinPool( Runtime.getRuntime().availableProcessors(), threadFactory, null, false); ForkJoinTask<Double> totals = pool.submit(() -> orders .parallelStream() .map(order -> { if (order.total == 0.0) { // lookups require application component namespace: try (Connection con = ((DataSource) InitialContext.doLookup( "java:comp/env/jdbc/ds1")) .getConnection()) { order.total = ... } catch (NamingException | SQLException x) { throw new CompletionException(x); } } return order.total; }) .reduce(0.0, Double::sum)); System.out.println("Sum is: " + totals.join()); pool.shutdown();
- 導入:
- 1.0
メソッドのサマリー
インターフェース java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactorySE から継承されたメソッド
newThreadSE
インターフェース java.util.concurrent.ThreadFactorySE から継承されたメソッド
newThreadSE