可能な質問- プロセスとスレッドの違いは何ですか?
- マルチスレッドプログラミングの利点は何ですか?
- ユーザースレッドとデーモンスレッドの違いは何ですか?
- Javaでスレッドを作成する方法は?
- スレッドのさまざまな条件は何ですか?
- Threadクラスでrun()メソッドを呼び出すことは可能ですか?
- 特定の時間スレッドを停止するにはどうすればよいですか?
- スレッドの優先度とは何ですか?
- スレッドスケジューラとタイムスライシングとは何ですか?
- マルチスレッドのコンテキスト切り替えとは何ですか?
- Javaでデーモンスレッドを作成する方法は?
プロセスとスレッド -違いは、プロセスは独立したアプリケーション(OSが制御)であり、スレッドはJavaでの並列実行用の独立した軽量スレッド(JVMとプログラマーが制御)であるということです。
マルチスレッドプログラミングの利点 -正しく記述されたマルチスレッドアプリケーションは、複数のプロセッサの使用により高速に実行され、スレッドの1つがリソースの受信を待機している間、プロセッサはアイドル状態になりません。
デーモンスレッドはバックグラウンドで実行されるスレッドであり、JVMはシャットダウンするために終了するのを待つ必要はありません。 setDaemon(true)を使用して任意のスレッドをデーモンにすることができますが、このメソッドは、startでスレッドを開始する前に呼び出す必要があります。
ThreadGroupは、スレッドグループに関する情報を提供する廃止されたAPIです。 現在、使用は推奨されていません。
Java Thread Dump-すべてのJVMスレッドの状態に関する情報を取得し、デッドロック状態またはその他のマルチスレッドの問題を検索します。 Java Thread Dumpを生成する方法は多数あります。たとえば、Java 8では、jcmdコマンドPID file_name for dumpまたはkill -3 PIDを使用して、または任意のプロファイラー(VisualVM、jstackなど)を使用して生成できます。
Java SEでスレッドを作成する方法:1. Runnableインターフェイスを実装するクラスを作成し、runメソッドを実装し、startメソッドでスレッドを開始します。runメソッドが正しく呼び出されないことに注意してください。この場合、新しいスレッドは作成されません(動作します)。
2. Threadクラスから継承クラスを作成し、runメソッドをオーバーライドし、startメソッドでスレッドを開始します。 方法1とは異なり、Threadクラスは既に定義された多数のメソッドを提供しますが、インターフェースを実装すると柔軟性が高まります(Javaでは多重継承ができないため)。
3.エグゼキュータを使用します。これにより、メソッド1-2の高レベルの類似物が提供されます。
スレッドメソッド1.
スリープ -指定した時間、またはスレッドが中断されなかった瞬間まで実行を停止します。
2.
割り込み -終了する必要があることをスレッドに送信します(スレッドのソフト割り込み)。スレッドはこの信号の処理をサポートする必要があります(定期的にThread.interruptedフラグを調べることにより)。
3.
結合 -別のスレッドの終了またはスレッド停止信号を待ちます。
4.
synchronized-メソッドまたは同期ブロックの前のキーワード(リンク){...}
5.
待機 -スレッドを停止し、通知またはnotifyAllの呼び出しを待機します。
6.
停止 (廃止)-スレッドをすぐに停止します。共有変数の状態が誤った状態になる可能性があるため、スレッドを使用しないことを強くお勧めします。
7.
サスペンド (非推奨)および再開(非推奨)-ストリームを一時的に停止して復元します。 非常に頻繁にデッドロックが発生するため、使用することはお勧めしません。「y(一時停止中にリソースはブロックされたままになります)
8.
setUncaughtExceptionHandler-このストリームに例外ハンドラーを追加する機能。
スレッドの特別な変数:ThreadLocal -1つのスレッドのみのローカル変数。各スレッドはその値を参照します。
volatileは、すべてのスレッドがメモリ(ヒープ)から読み取り、キャッシュしない変数をマークするキーワードです。 これはすべての同期の問題を解決するわけではありませんが、通常の変数ストリームにはキャッシュする権利があり、長時間更新する権利はまったくありません。 複数のスレッドでより信頼性の高い作業を行うには、アトミック変数または同期ブロックを使用する必要があります。