インターフェース 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 インターフェースを実装する必要があります。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