Javaスレッド(5):Exectors、ThreadFactory


Exectors
public class Exectors
  • 機能が非常に強い補助類です。
  • このカバンで定義されているExector、Exector Service、ScheduledExect rService、ThreadFactory、Callable類の工場と実用方法。このようなサポートの様々な方法:
  • は、一般的に構成された文字列が設定されたExectorServiceを作成し、戻す方法である。
  • は、一般的に構成された文字列が設定されたScheduledExectorServiceを作成し、戻す方法である。
  • は、実装された特定の方法にアクセスできないようにすることによって、再構成を無効にする「パッケージ」ExectorService方法を作成して返信する。
  • は、新たに作成されたスレッドを既知の状態に設定することができるThreadFactoryを作成して返す方法である。
  • は、Callableを必要とする実行方法において、非閉ループ形態のCallableを作成して戻す方法である。
  • Callableのサポートについて
    Callable callable(Runnable task, T result)
    
    Callableオブジェクトを返します。指定されたタスクを実行し、結果を返します。calableはcallbleと同等です。
        public static  Callable callable(Runnable task, T result) {
            if (task == null)
                throw new NullPointerException();
            return new RunnableAdapter(task, result);
        }
    
    Runnable Adapter類
        /**
         * A callable that runs given task and returns given result
         */
        static final class RunnableAdapter implements Callable {
            final Runnable task;
            final T result;
            RunnableAdapter(Runnable  task, T result) {
                this.task = task;
                this.result = result;
            }
            public T call() {
                task.run();
                return result;
            }
        }
    
    
  • Callable callable
  • Callableオブジェクトを返します。指定された特権の操作を実行して結果を返します。callable(PrivilegedException Action)とそれは類似していますが、唯一の違いは前者が異常を投げることができることです。
        public static Callable callable(final PrivilegedAction> action) {
            if (action == null)
                throw new NullPointerException();
            return new Callable() {
    	    public Object call() { return action.run(); }};
        }
    
    PrivilegedActionインターフェース
    public interface PrivilegedAction {
        T run();
    }
    
  • Callable prive gedCallable
  • Callableオブジェクトを返します。呼び出しは現在のアクセス制御コンテキストで指定されたcallbleオブジェクトを実行できます。Callable privegedCallable UsingCurrenntClass LoaderはCallableオブジェクトに戻り、呼び出し時に現在のアクセス制御コンテキストにおいて、現在のコンテキストクラス加担器をコンテキストクラスブースターとして使用して所定のcallableオブジェクトを実行します。
    ExectorServiceのサポートについて
  • newCachedThreadPool(無境界スレッド池、自動スレッド回収可能)
  • newFixedThreadPool(固定サイズスレッド池)
  • newSingleThreadExector(単一バックグラウンドスレッド)
  • newScheduledThreadPool(スケジューリング可能)
  • このようないくつかの使用方法を紹介しないで、当然ながら、自己の業務シーンによって、Exectorsが返すスレッド池オブジェクトの弊害は以下の通りである。(1)FixedThreadPoolとSingleThreadPool:許可の要求キュー長はInteger.MAXUVALEであり、大量の要求が蓄積されて、OOMを引き起こす可能性がある。CachedThreadPoolとScheduledThreadPool:許可された作成スレッド数はInteger.MAXUVALEであり、大量のスレッドが作成される可能性があり、OOMを引き起こす。
  • ExectorService newFixedThreadPool(int nThreads,ThreadFactory threadFactory)
  • これらのスレッドは、必要な時に提供されたThreadFactoryを使って新しいスレッドを作成するために、固定スレッド数を再利用するスレッドを作成します。
        public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
            return new ThreadPoolExecutor(nThreads, nThreads,
    	          0L, TimeUnit.MILLISECONDS,
             new LinkedBlockingQueue(), threadFactory);
        }
    
    newCachedThreadPool()とnewSingleThreadExector()の実現はnewFixedThreadPoolと似ていますが、ThreadPool Exectorを呼び出しても、構造方法やパラメータ値が異なります。
  • ExectorService unconfigrable Exect rService(Exect rvice exector)
  • 定義されたすべてのExectorService方法を指定実行プログラムのオブジェクトに委託するが、強制変換を使用すると他の方法にアクセスできなくなる可能性があります。これは安全に「凍結」された構成を提供し、特定の実装を調整することができない方法です。
        public static ExecutorService unconfigurableExecutorService(ExecutorService executor) {
            if (executor == null)
                throw new NullPointerException();
            return new DelegatedExecutorService(executor);
        }
    
    ScheduledExectorServiceのサポートについて
  • ScheduledExect rService newSingleThreadScheduledExector
  • 単一スレッド実行プログラムを作成します。遅延が与えられた後、コマンドを実行するか、または定期的に実行するように手配できます。
        public static ScheduledExecutorService newScheduledThreadPool(
                int corePoolSize, ThreadFactory threadFactory) {
            return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
        }
    
  • ScheduledExect rService newSingleThreadScheduledExector
  • 単一スレッド実行プログラムを作成します。遅延が与えられた後、コマンドを実行するか、または定期的に実行するように手配できます。
        public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) {
            return new DelegatedScheduledExecutorService
                (new ScheduledThreadPoolExecutor(1, threadFactory));
        }
    
    ThreadFactoryのサポートについて
  • ThreadFactory default ThreadFactory()
  • 新しいスレッドを作成するための標準スレッド工場を返します。
       public static ThreadFactory defaultThreadFactory() {
            return new DefaultThreadFactory();
        }
    
  • ThreadFactory privlegedThreadFactory()
  • 新しいスレッドを作成するスレッド工場を返します。これらの新しいスレッドは現在のスレッドと同じ権限を持っています。
        public static ThreadFactory privilegedThreadFactory() {
            return new PrivilegedThreadFactory();
        }
    
    まとめる
    ExectorService
    ScheduledExect rService
    ThreadFactory
    Callable
    newFixedThreadPool
    newScheduledThreadPool
    Default ThreadFactory
    ケーブル
    newScheduledThreadPool
    newSingleThreadScheduledExector
    PrivilegedThreadFactory
    privlegedCallable
    newSingle ThreadExector
    unconfigrable ScheduledExect rService
    prive gedCallable UsingCurent Class Loader
    newCachedThreadPool
    ThreadFactory
    public interface ThreadFactory
  • 必要に応じて、新しいスレッドのオブジェクトを作成します。スレッド工場を使用すると、new Threadへの呼び出しを手動で作成する必要がなくなり、アプリケーションは特殊なスレッドの種類、属性などを使用することができます。
  • Exectorsは、そのサポートを提供します。Default ThreadFactoryとPriviledThreadFactory。
  • public interface ThreadFactory {
        /**
         *       Thread。
         */
        Thread newThread(Runnable r);
    }
    
    
    Exectors.Default ThreadFactory
        static class DefaultThreadFactory implements ThreadFactory {
            static final AtomicInteger poolNumber = new AtomicInteger(1);
            final ThreadGroup group;
            final AtomicInteger threadNumber = new AtomicInteger(1);
            final String namePrefix;
    
            DefaultThreadFactory() {
                SecurityManager s = System.getSecurityManager();
                group = (s != null)? s.getThreadGroup() :
                                     Thread.currentThread().getThreadGroup();
                namePrefix = "pool-" +
                              poolNumber.getAndIncrement() +
                             "-thread-";
            }
    
            public Thread newThread(Runnable r) {
                Thread t = new Thread(group, r,
                                      namePrefix + threadNumber.getAndIncrement(),
                                      0);
                if (t.isDaemon())
                    t.setDaemon(false);
                if (t.getPriority() != Thread.NORM_PRIORITY)
                    t.setPriority(Thread.NORM_PRIORITY);
                return t;
            }
        }
    
    ソースからDefault ThreadFactoryは通常のスレッドを作成し、優先度は5です。新しいスレッドはpool-N-thread-MのThread.getName()を通じてアクセスできる名前を持っています。ここでNはこの工場のシリアルナンバーで、Mはこの工場で作成されたスレッドのシリアルナンバーです。
  • Exectors.PrivilegedThreadFactory
  •     static class PrivilegedThreadFactory extends DefaultThreadFactory {
            private final ClassLoader ccl;
            private final AccessControlContext acc;
    
            PrivilegedThreadFactory() {
                super();
                this.ccl = Thread.currentThread().getContextClassLoader();
                this.acc = AccessController.getContext();
                acc.checkPermission(new RuntimePermission("setContextClassLoader"));
            }
    
            public Thread newThread(final Runnable r) {
                return super.newThread(new Runnable() {
                    public void run() {
                        AccessController.doPrivileged(new PrivilegedAction() {
                            public Object run() {
                                Thread.currentThread().setContextClassLoader(ccl);
                                r.run();
                                return null;
                            }
                        }, acc);
                    }
                });
            }
    
        }
    
    ソースからは、PrivilegedThreadFactory extends Default ThreadFactoryはdefault ThreadFactoryと同じスレッドを持っていますが、2つの特性が追加されました。Class LoaderとAccess Control ControlControtxtは、このようなスレッドで実行されるタスクは、前スレッドと同じアクセス制御とキャリアを有します。