Javaの非同期タスク実行サービス(A):基本的な概念と原則

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
  • ExecutorService2つのがありますバッチタスクを送信する方法は:invokeAll()invokeAny()彼らは2つのバージョンが、限られた待機時間を持っています。
  • invokeAll()完了するために、すべてのタスクを待つ方法と返すFutureリストを、それぞれFutureisDone()方法を返す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):基本的な概念と原則


おすすめ

転載: www.cnblogs.com/sanxiandoupi/p/11639847.html