スレッドプールを使用するのは簡単コーラブル、今後、

コーラブル、今後とスレッドプール

3通りの方法で新しいスレッドを作成し、继承Threadそして实现Runnable接口両方の方法は、戻り値ではないので、私たちは子供は結果だけでデータを共有するように設定することができますスレッドを取得したい場合は、だけでなく、同期の問題は、あまりにも多くの問題を考慮する必要があります。呼び出し可能インターフェースは、この問題の解決策です。

呼び出し可能

呼び出し可能と類似のRunnableの唯一の方法である象徴的なインタフェースV call()正常復帰vを計算するときには、算出したエラーの例外がスローされ、戻り値があるだけで呼び出し可能な、例外Expectionを宣言する。
単一呼び出し可能と何も言うこと、と一般的にインタフェースがありませんFuture使用するインターフェイスを。

将来のインターフェイス

将来の呼び出し可能インターフェースのタスクが処理され、仕上げ作業の方法があります。

//获取结果,若无结果会阻塞至异步计算完成
V get()
//获取结果,超时返回null
V get(long timeOut, TimeUnit unit)
//执行结束(完成/取消/异常)返回true
boolean isDone()
//任务完成前被取消返回true
boolean isCancelled()
//取消任务,未开始或已完成返回false,参数表示是否中断执行中的线程
boolean cancel(boolean mayInterruptRunning)

その中でも、ためにboolean cancel(boolean mayInterruptRunning)引数の方法:
単純に、タスクが既に始まっている場合はfalseパラメータのみ、タスクがまだ開始されていないキャンセルすることができ渡して、入れになったそのダウンを実行。
あなたが未来のインスタンスを作成すると、タスクは、以下の3つの状態を有することができる:
スタンバイ状態に。この時点でキャンセルを呼び出す()メソッドはtrueまたはfalseのキャンセルのためにマーク合格するかどうか、タスクがまだタスクキューに保存されますが、今度は、このタスクの実行をスキップしますとき。
完了ステータス。タスクが完了しているので、この場合には)(キャンセル効果がありません。
操作。この時間は、タスク割り込み真に渡しで中断されていない偽渡し、実行されています。

将来の実装サブクラスはFutureTask<V>、すなわち、クラスは、このように呼び出し可能FutureTaskを一緒に使用することが、Runnableインタフェースを実装し、インタフェース未来を実装します。

Callable<Integer> c = ()->{
    Thread.sleep(3000);//模拟计算
    return 100;//返回计算结果
};
//实例化FutureTask,注意这里不能使用Future的多态形式,因为只有FutureTask实现了Runnable接口
FutureTask<Integer> ft = new FutureTask<>(c);
//启动线程
new Thread(ft).start();
//获取计算结果,注意这里会阻塞
System.out.println(ft.get());

FutureTaskは、2つのコンストラクタを提供します。

//上例使用的就是这个,参数为Callable
public FutureTask(Callable<V> callable) {
}
//当Runnable执行成功时返回result(这有个毛用啊。。。)
public FutureTask(Runnable runnable, V result) {
}

FutureTaskは簡単にスレッドを開始することができます。

スレッドプール

FutureTaskの使用に加えて使用することも可能でCallable + Future + 线程池呼び出し可能な方法を実行するために:

Callable<Integer> c = ()->{
    Thread.sleep(3000);
    return 100;
};
//构建定长线程池
ExecutorService service = Executors.newFixedThreadPool(10);
//在线程池中提交Callable时会返回Future对象
Future<Integer> future = service.submit(c);
System.out.println(future.get());

アリ開発ハンドブック要件で、唯一の便宜のために道を作成するには、スレッドプールの例:

[必須]スレッドプールエグゼキュータを作成するために許可されていませんが、ThreadPoolExecutorの方法により、このアプローチは、資源の枯渇の危険性を回避するために、学生がより明示的な運用ルールのスレッドプールを作成することができます。
説明:次のようにスレッドプールオブジェクトが返されるエグゼキュータの欠点:
1)及びFixedThreadPool SingleThreadPool:
許容リクエストキュー長Integer.MAX_VALUEでは、それによってOOMを引き起こす、多数の要求を蓄積してもよいです。
2)CachedThreadPoolとScheduledThreadPoolは:
OOMを得、多数のスレッドを作成することができ、スレッドの数にInteger.MAX_VALUEを作成することを可能にします。

いくつかのスレッドプールエグゼキュータのために提供されています。

newSingleThreadExecutor
シングルスレッドのスレッドプールを作成します。これは、すべてのタスクのシングルスレッドのシリアル実行と等価であるだけで、スレッドプールのスレッドの仕事、です。唯一の理由は、異常終了のこのスレッド場合は、それに代わる新しいスレッドがあるでしょう。
このスレッドプールは、すべてのタスクの実行順序は、タスクの順に提示することを確実にします。

new ThreadPoolExecutor(1, 1,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>())

newFixedThreadPool
固定サイズのスレッドプールを作成します。スレッドプールのスレッドが最大サイズに到達するまでたびに、スレッドを作成するタスクを提出します。スレッドプールのサイズが到達すると、スレッドの実行異常終了すると、スレッドプールは、新しいスレッドを追加するための最大は、変更されません。

new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());

newCachedThreadPool
キャッシュされたスレッドプールを作成します。スレッドプールのスレッドのサイズが必要な処理タスクを超えた場合、それは部分的に自由に回復するタスクの数、このスレッドプールとインテリジェントには、タスクを処理する新しいスレッドを追加するときに、スレッド(60秒は、タスクを実行しません)。
このスレッドプールは、スレッドプールのサイズを制限しない、スレッドプールのスレッドの最大サイズは、作成することができるオペレーティングシステム(またはJVM)のサイズに完全に依存します。

new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());

newScheduledThreadPool
定期的かつ定期的なタスクの実行をサポートするために、固定サイズのスレッドプールを作成します。実質的に同一の遅延を実行しnewFixedThreadPoolに加えて、タイミングは、タスクを実行するために使用することができます

上記の4つの方法だけで、より便利な、アリのマニュアルでは、開発者は、これらのメソッドを使用して、スレッドプールの道アリ要件をチェックアウトすることはできませんが必要です。

public ThreadPoolExecutor(
    int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    ThreadFactory threadFactory,
    RejectedExecutionHandler handler
) 

パラメータは次のとおりです。

  • corePoolSize - スレッドプールのコアプールのサイズ。
  • maximumPoolSize - スレッドプール内のスレッドの最大数。
  • keepAliveTime - スレッドの数がコアよりも大きい場合、このタスクは、最も長い時間を終了する前に、新たな超過したアイドル状態のスレッドを待っています。
  • unit - keepAliveTimeが時間単位。
  • workQueue - タスクを実行するために待機しているキュー格納するために使用されます。
  • threadFactory - スレッドファクトリ。
  • handler - 拒否ポリシー

1つの懸念スレッドプールのサイズ
スレッドプールスレッドは二つの数、コア数、スレッドの最大数のスレッドのプールのセットを有します。
あなたがスレッドプールを作成した後、タスクがタスクを実行するスレッドを作成することでしたまであなたがprestartAllCoreThreads()またはprestartCoreThread()メソッドを呼び出していない限り、デフォルトでは、スレッドプールとなしのスレッドを待機
スレッドの数が等しい作成したときにcorePoolSize時間、これは、ブロッキングキュー設定に参加します。キューがいっぱいになると、それは、プール内のスレッドの数がmaximumPoolSizeに等しくなるまでのタスクを実行するスレッドを作成します。
懸念2適切なブロッキングキュー
java.lang.IllegalStateException:キューフル
メソッドが例外をスローする特殊な値が出ブロックされ、終了された返す
挿入方法は、(e)の提供(E)を追加置く(e)の提供(E、時間、単位)が
削除されますメソッドRemove()ポール()を取る( )ポーリング(時間単位)
の検査方法の要素()PEEK()
とArrayBlockingQueueは:構造体の配列は、キューをブロック境界。
LinkedBlockingQueue:ブロッキングキュー囲まれた構造体のリンクリスト。
PriorityBlockingQueue:無制限のブロッキングキューのサポートの優先順位付け。
DelayQueue:プライオリティキューアンバウンド形式のブロッキングキューの実装を使用します。
SynchronousQueue:ブロッキングキュー要素が格納されていません。
LinkedTransferQueue:無制限ブロッキングキューからなるリスト構造。
LinkedBlockingDeque:双方向のブロッキングキューからなるリンクリスト構造。
3つの焦点は、明示的ポリシー拒否され
たタスクを破棄し、スロー:ThreadPoolExecutor.AbortPolicy
RejectedExecutionException例外を。(デフォルト)
ThreadPoolExecutor.DiscardPolicy:タスクが破棄されますが、例外をスローしません。
ThreadPoolExecutor.DiscardOldestPolicy:一番のタスクキューを破棄し、再度(このプロセスを繰り返し)タスクを実行しよう
ThreadPoolExecutor.CallerRunsPolicy:このタスクは、呼び出し元のスレッドによって処理されます


参照

おすすめ

転載: www.cnblogs.com/lixin-link/p/11128487.html