スレッドではなくハンドラを使用する利点/理由は何ですか?
A ハンドラは、あなたがメッセージと送信して処理することを可能にするRunnable
スレッドのに関連付けられているオブジェクトをMessageQueue
。各Handler
インスタンスは、単一のスレッドとそのスレッドのメッセージキューに関連付けられています。
新しいを作成するとHandler
、それは、それを作成しているスレッドのスレッド/メッセージキューにバインドされます。その時点から、メッセージと実行可能ファイルはそのメッセージキューに配信され、メッセージキューから出たときに実行されます。 。
ハンドラーの主な用途は2つあります。
- メッセージとRunnableが将来のある時点で実行されるようにスケジュールする
- 自分のスレッドとは異なるスレッドで実行されるアクションをエンキューします。
Javaスレッドを使用する場合は、メインスレッドとの同期、スレッドのキャンセルなど、自分で何かを処理する必要があります。
ThreadPoolExecutor
またはExecutorService
API を使用しない限り、この単一のスレッドはスレッドプールを作成しません。
(Blackbeltの回答に関するコメントからこのクエリを取得してください)
エグゼキューターを使用しないのはなぜですか?それを行うためにハンドラーを使用したいと思ったとしても、どうやって?
参照:スレッドパフォーマンスの記事
高度な並列分散タスクに削減できる特定のタイプの作業があります。作業パケットの膨大な量では、これが作成し、AsyncTask
そしてHandlerThread
適切なクラスではありません。のシングルスレッドの性質は、スレッドAsyncTask
プールされたすべての作業を線形システムに変えます。HandlerThread
一方、クラスを使用すると、プログラマーはスレッドのグループ間の負荷分散を手動で管理する必要があります。
ThreadPoolExecutorは、このプロセスを簡単にするためのヘルパークラスです。このクラスは、スレッドのグループの作成を管理し、それらの優先順位を設定し、作業がそれらのスレッド間でどのように分散されるかを管理します。ワークロードが増加または減少すると、クラスはワークロードに適応するためにより多くのスレッドをスピンアップまたは破棄します。
BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(), // Initial pool size
Runtime.getRuntime().availableProcessors(), // Max pool size
1, // KEEP_ALIVE_TIME
TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT
workQueue);
詳細については、create-threadpoolに関するこの開発者ガイドの記事を参照してください。
Handler
複数のRunnableインスタンスを実行するための使用法については、この投稿をご覧ください。この場合、すべてのRunnable
タスクは単一のスレッドで実行されます。
Android:スレッドでのトースト