1.非同期タスク実行サービスこれは何を意味するのでしょうか?
回答:
- スレッド
Thread
実行することを約束し、両方のタスク(run()
メソッド)、および実装そのメカニズム(start()
方法) 。 Java
そして、大幅に非同期タスクを実行するために必要な開発を簡素化するフレームワーク契約を提供し、このフレームワークは、「実行サービス」の概念を導入します。- サービスは、タスクと相分離のタスクを実行するためにコミットされます、「サービスの実装は、」ジョブの投入が懸念しているため、それはせずに、タスクをキャンセル、結果を取得するには、そのようなジョブを送信すると、タスク自体に集中することができ、タスクの実行の詳細をカプセル化そのようなスレッドの作成、タスクスケジューリング、ように閉じられ、スレッドとして実行されるタスクの詳細に焦点を当てる必要があります。
- 同時非同期サービスを実行するためのタスクは、開発に反映関心事の分離という考えを、ユーザーが唯一する必要が合格
ExecutorService
してタスクを提出しFuture
、オペレーティング・タスクと結果がすることができ、詳細スレッドの作成と調整に焦点を当てる必要はありません。
2.基本的なインタフェースは、サービスが必要なタスクを実行するには?
回答:
Runnable
そしてCallable
:あなたが実行したいと非同期タスクを。Executor
そしてExecutorService
:その実行サービス。Future
:非同期タスクの示した結果を。
Runnableを、呼び出し可能です違い3は何ですか?
:どちらも、タスクを表します。
Runnable
結果は返されませんが、されてCallable
常に返します。Runnable
例外がスローされていないとCallable
例外がスローされます。
4.どのようにエグゼキュータを理解するには?
回答:
Executor
これは、最も簡単な実行サービスを表します。- 定義:
public interface Executor { void execute(Runnable command); }
、それは我々が行うことができないことであるRunnable
ノーリターン結果を。 - 限られた使命ではない、新しいスレッドを作成することができますどのように、スレッドは、スレッドプールを多重化することができる、それが呼び出し側のスレッドで実行することができます。
5.どのようにExecutorServiceのを理解するには?
回答:
ExecutorService
拡充Executor
追加サービスの定義を、基本的な方法は以下のとおりです。public interface ExecutorService extends Executor { <T> Future<T> submit(Callable<T> task); <T> Future<T> submit(Runnable task, T result); Future<?> submit(Runnable task); void shutdown(); List<Runnable> shutdownNow(); boolean isShutdown(); boolean isTerminated(); boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException; <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException; <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException; <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException; <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
三つの
submit()
タスクを送信表明している、戻り値の型があるFuture
戻った後、しかし、タスクが提出されたと述べ、あなたが実行したことを意味するものではありませんを通じてFuture
、最終的な結果を得るための非同期タスクのステータスを確認することができ、タスクをキャンセル。以下のためにCallable
のためにタスク最終的には、値を返すRunnable
戻り値がありません。ことを第二Runnable
の方法は、同時に結果を提供することができ、非同期タスクの終了時に返される;第三の方法は、最終的に、非同期タスクが返されますnull
。- そこ閉じるには二つの方法があります:
shutdown()
とshutdownNow()
。違いは、ありませんshutdown()
。それはもはや新しいタスクを受け入れているが、タスクは、タスクがまだ開始されていない場合でも、継続します提出されているshutdownNow()
一般的な、新しいタスクを受け入れない、とタスクが提出されたがまだ実行されて終了するだけでなく、実行中のタスクのためこれは、スレッドの呼び出し、interrupt()
メソッドを中断しようとしますが、スレッドを中断するために応答しないことがshutdownNow()
提出したが、まだ実装されていないされたタスクリストに戻ります。 shutdown()
そして、shutdownNow()
彼らはすべてのタスクが完了していることを意味するものではありません返しますが、後に、待機をブロックしていないisShutdown()
メソッドが返しますtrue
。呼び出し側は、できるawaitTermination()
すべてのタスクの終了を待つこと、すべてのタスクがオーバーしている場合、それがタイムアウトする前に待機時間を定義することができ、isTerminated()
メソッドの戻りtrue
、戻りtrue
、それ以外の場合は返しますfalse
。ExecutorService
2つのがありますバッチタスクを送信する方法は:invokeAll()
とinvokeAny()
彼らは2つのバージョンが、限られた待機時間を持っています。invokeAll()
完了するために、すべてのタスクを待つ方法と返すFuture
リストを、それぞれFuture
のisDone()
方法を返すtrue
が、isDone()
されたことはtrue
、タスクが正常に実行されていることを意味するものではありません、それがキャンセルされた可能性があります。invokeAll()
あなたは残業のミッションが完了した、もしあれば、待機時間を指定することができ、それがキャンセルされます。- 以下のために
invokeAny()
限りがあり、制限時間成功したリターン内のタスクがあり、そしてそれは、他のタスクがキャンセルされます、タスクの結果を返しますよう、何のタスクが正常に制限時間内に戻らない場合は、スローTimeoutException
例外を、制限時間内にすべてのタスクが終わった場合しかし、それは例外スロー受けたExecutionException
例外を。 - 使用
ExecutorService
逐次プログラムを書くように同時非同期タスクを書いたコードを、スレッドはタスクのみを提出する必要があり、創造とコーディネートを気にしない、との結果がすることができ、大幅に開発作業を簡素化します。
6.どのように未来を理解するには?
回答:
Future
インタフェースの定義:public interface Future<V> { boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
get()
タスクが実行されていない場合、最終的な結果を得るために使用される方法は、待機がブロックされます、非同期タスクを返される ;のパラメータget()
方法は、タイムアウトタスクが完了しない場合は、それがスローされます、限られた時間を待ってブロックすることができるTimeoutException
例外を。cancel()
タスクが完了、またはキャンセル、または何らかの理由でキャンセルすることはできませんされている場合は、非同期タスクをキャンセルするために使用し、cancel()
返されたfalse
それ以外の場合は、true
。タスクがまだ開始されていない場合、それはもはや実行されていません。タスクがすでに実行されている場合、あなたはキャンセルすることができないかもしれない。しかし、パラメトリックは、mayInterruptIfRunning
タスクが実行されている場合、呼び出しかどうか、と言ったinterrupt()
方法がスレッドに割り込むことがあるならば、false
それであれば、それは、ないでしょうtrue
、それはものの、スレッドを打破しようとする割り込みがスレッドをキャンセルすることができないかもしれません。isDone()
そして、isCancelled()
ジョブの状態を問い合わせます。isCancelled()
これは、タスクがキャンセルされたかどうかを示す限り、cancel()
メソッドの戻りtrue
、その後のisCancelled()
メソッドが返すtrue
スレッドの使命は終わっ本当にいない場合でも、。isDone()
どんな理由がカウントされているため、タスクが完了したことを示すキャンセルされた、タスクの正常終了することができ、タスクは例外がスローされることがあり、それが仕事である可能性があります。以下のために
get()
呼び出す場合の方法、get()
スレッドメソッドが中断され、get()
この方法はスローInterruptedException
例外、最終的には約3成果タスクを:- 正常に終了し、
get()
タスクがある場合の方法は、その実行の結果を返しRunnable
、結果が返すために提供されていませんnull
。 - タスクの実行が例外をスローし、
get()
この方法は、例外がされてラップされるExecutionException
例外によって再スローgetCause()
オリジナル異常方法を得ることができます。 - タスクがキャンセルされた、
get()
メソッドは例外をスローしますCancellationException
。
- 正常に終了し、
Future
これは重要な概念であると「ミッション」相分離、「リンク」の一つであり、「タスク提出」を達成するための鍵である関心のその単離それぞれのポイントを介してタスクの提出者とタスク実行サービスを、とのコラボレーション。
[7]タスク実行サービスのデモを手書きペンの質問?
回答:
public class BasicDemo {
static class Task implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int sleepSeconds = new Random().nextInt(1000);
Thread.sleep(sleepSeconds);
return sleepSeconds;
}
}
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor(); // 使用工厂类 Executors 创建了一个任务执行服务,表示使用一个线程执行所有服务
Future<Integer> future = executor.submit(new Task());
// 模拟执行其他任务
Thread.sleep(100);
try {
System.out.println(future.get());
} catch(ExecutionException e) {
e.printStackTrace();
}
executor.shutdown(); // 关闭任务执行服务
}
}
基本的な原則の8 ExecutorServiceの実現?
回答:
ExecutorService
クラスの主な成果は、ThreadPoolExecutor
それは、スレッドプールの認識に基づいていること。ExecutorService
抽象クラスの実現もありますAbstractExecutorService
。AbstractExecutorService
提供submit()
、invokeAll()
、invokeAny()
デフォルトの実装では、サブクラスは他のメソッドを実装する必要があります。加えてexecute()
、他の管理方法が実行サービスのライフサイクルに関連しています。submit()
、invokeAll()
、invokeAny()
最終的に呼び出してexecute()
、execute()
私たちは、タスクを実行する方法を最終的に決めました。
基本的な原則の9将来実現?
回答:
Future
メイン実装するクラスですFutureTask
。FutureTask
これは、実装RunnableFuture
のインターフェイスを。RunnableFuture
インターフェイスは展開しないだけRunnable
でなく、拡張されFuture
、新しいメソッドの定義。Runnable
それはタスクが実行されることを示しているに渡されるexecute()
実行方法;としてFuture
は、非同期タスクの実行結果を示しています。
[10]手書きペンの質問には、単純な実装クラスをExecutorServiceの?
回答:
public class SimpleExecutorService extends AbstractExecutorService {
@Override
public void shutdown() {
}
@Override
public List<Runnable> shutdownNow() {
return null;
}
@Override
public boolean isShutdown() {
return false;
}
@Override
public boolean isTerminated() {
return false;
}
@Override
public boolean awaitTermination(long itmeout, TimeUnit unit) throws InterruptedException {
return false;
}
@Override
public void execute(Runnable command) {
new Thread(command).start();
}
}
オリジナル:ビッグボックス Javaの非同期タスクの実行サービス(A):基本的な概念と原則