Javaスレッド(5):Exectors、ThreadFactory
Exectors
public class Exectors機能が非常に強い補助類です。 このカバンで定義されているExector、Exector Service、ScheduledExect rService、ThreadFactory、Callable類の工場と実用方法。このようなサポートの様々な方法: は、一般的に構成された文字列が設定されたExectorServiceを作成し、戻す方法である。 は、一般的に構成された文字列が設定されたScheduledExectorServiceを作成し、戻す方法である。 は、実装された特定の方法にアクセスできないようにすることによって、再構成を無効にする「パッケージ」ExectorService方法を作成して返信する。 は、新たに作成されたスレッドを既知の状態に設定することができるThreadFactoryを作成して返す方法である。 は、Callableを必要とする実行方法において、非閉ループ形態のCallableを作成して戻す方法である。 Callableのサポートについて Callable callable Callableオブジェクトを返します。指定された特権の操作を実行して結果を返します。callable(PrivilegedException Action)とそれは類似していますが、唯一の違いは前者が異常を投げることができることです。 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を使って新しいスレッドを作成するために、固定スレッド数を再利用するスレッドを作成します。 ExectorService unconfigrable Exect rService(Exect rvice exector) 定義されたすべてのExectorService方法を指定実行プログラムのオブジェクトに委託するが、強制変換を使用すると他の方法にアクセスできなくなる可能性があります。これは安全に「凍結」された構成を提供し、特定の実装を調整することができない方法です。 ScheduledExect rService newSingleThreadScheduledExector 単一スレッド実行プログラムを作成します。遅延が与えられた後、コマンドを実行するか、または定期的に実行するように手配できます。 ScheduledExect rService newSingleThreadScheduledExector 単一スレッド実行プログラムを作成します。遅延が与えられた後、コマンドを実行するか、または定期的に実行するように手配できます。 ThreadFactory default ThreadFactory() 新しいスレッドを作成するための標準スレッド工場を返します。 ThreadFactory privlegedThreadFactory() 新しいスレッドを作成するスレッド工場を返します。これらの新しいスレッドは現在のスレッドと同じ権限を持っています。
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。 。 Exectors.PrivilegedThreadFactory
public class Exectors
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;
}
}
public static Callable
PrivilegedActionインターフェースpublic interface PrivilegedAction {
T run();
}
ExectorServiceのサポートについて
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(), threadFactory);
}
newCachedThreadPool()とnewSingleThreadExector()の実現はnewFixedThreadPoolと似ていますが、ThreadPool Exectorを呼び出しても、構造方法やパラメータ値が異なります。 public static ExecutorService unconfigurableExecutorService(ExecutorService executor) {
if (executor == null)
throw new NullPointerException();
return new DelegatedExecutorService(executor);
}
ScheduledExectorServiceのサポートについて public static ScheduledExecutorService newScheduledThreadPool(
int corePoolSize, ThreadFactory threadFactory) {
return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
}
public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) {
return new DelegatedScheduledExecutorService
(new ScheduledThreadPoolExecutor(1, threadFactory));
}
ThreadFactoryのサポートについて public static ThreadFactory defaultThreadFactory() {
return new DefaultThreadFactory();
}
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
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はこの工場で作成されたスレッドのシリアルナンバーです。 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は、このようなスレッドで実行されるタスクは、前スレッドと同じアクセス制御とキャリアを有します。