インターフェース ManagedThreadFactory

すべてのスーパーインターフェース:
ForkJoinPool.ForkJoinWorkerThreadFactorySEThreadFactorySE

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 インターフェースを実装する必要があります。仮想スレッドは ManageableThread を実装しません。ThreadFactory.newThread(Runnable)SE メソッドを使用して新しいスレッドに割り当てられた Runnable タスクは、この ManagedThreadFactory インスタンスを作成 (検索) したコンポーネントインスタンスのアプリケーションコンポーネントコンテキストで実行されます。

ForkJoinPool.ForkJoinWorkerThreadFactory.newThread(ForkJoinPool)SE メソッドによって作成された ForkJoinWorkerThreadSE は、この ManagedThreadFactory インスタンスを作成 (ルックアップ) したコンポーネントインスタンスのアプリケーションコンポーネントコンテキストでタスクを実行します。Jakarta EE Product Provider は、ForkJoinWorkerThread ごとに 1 回コンテキストを確立し、ForkJoinWorkerThreadSE で実行される操作間でコンテキストをリセットしません。

タスクは明示的なトランザクションなしで実行されます(アプリケーションコンポーネントのトランザクションには参加しません)。トランザクションが必要な場合は、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