実世界のアプリケーションを実行する際には、高速な実行のために優れたプロセッサを使用します。しかし、プロセッサの速度だけではアプリケーションを高速に実行することはできません。パフォーマンス効率の高いアプリケーションを作成するための一つの素晴らしい方法は、マルチスレッディングを利用することです。
マルチスレッディングとは何ですか?
マルチスレッディングは、アプリケーションが並列で実行するための小さなタスクの単位を作成できるプログラミングの概念です。コンピュータ上で作業している場合、複数のアプリケーションが実行され、それらに処理能力が割り当てられます。単純なプログラムは順次実行され、コード文が一つずつ実行されます。これはシングルスレッド型のアプリケーションです。しかし、プログラミング言語が複数のスレッドを作成し、それらをオペレーティングシステムに渡して並列実行させることをサポートしている場合、それはマルチスレッディングと呼ばれます。
マルチスレッディングとマルチプロセッシング
マルチスレッディングについて話すとき、マシンが2コアのプロセッサを持っているのか、16コアのプロセッサを持っているのかは問題ではありません。私たちの仕事はマルチスレッド型のアプリケーションを作成し、OSに割り当てと実行を任せることです。要するに、マルチスレッディングはマルチプロセッシングとは関係ありません。
Javaはマルチスレッドをサポートしていますか?
Javaはマルチスレッドのアプリケーションをサポートしています。JavaはThreadクラスを通じてマルチスレッドをサポートしています。JavaのThreadは、いくつかのタスクを実行する軽量プロセスを作成することを可能にします。プログラム内で複数のスレッドを作成し、それらを開始することができます。Javaランタイムは、マシンレベルの命令を作成し、それらを並行して実行するためにOSと連携します。
スレッドの異なるタイプは何ですか?
アプリケーション内には、2つのタイプのスレッドがあります- ユーザースレッドとデーモンスレッド。アプリケーションを開始すると、mainが最初に作成されるユーザースレッドです。ユーザースレッドだけでなく、デーモンスレッドも複数作成することができます。すべてのユーザースレッドが実行されると、JVMはプログラムを終了します。
スレッドの優先度とは何ですか?
スレッドを作成する際には、その優先度を割り当てることができます。異なるスレッドに異なる優先度を設定することができますが、高い優先度のスレッドが低い優先度のスレッドよりも先に実行されることを保証するものではありません。スレッドスケジューラはオペレーティングシステムの実装の一部であり、スレッドが開始されると、その実行はスレッドスケジューラによって制御され、JVMはその実行に対して制御を持っていません。
Javaでスレッドを作成する方法は?
スレッドは、Runnableインターフェースを実装するか、Threadクラスを拡張することによって作成することができます。
Thread t = new Thread(new Runnable(){
@Override
public void run() {
}
});
上記は新しいスレッドを作成するための1行のステートメントです。ここでは、無名クラスとして実行可能なスレッドを作成しています。もしラムダ式について理解している場合、より短いコードでスレッドを作成することもできます。
Runnable runnable = () -> System.out.println("Hello");
スレッドを作成したら、start()メソッドを呼び出してその実行を開始する必要があります。
runnable.start();
I have written a lot of posts explaining the concepts of multithreading in Java. You can go through these in sequence to learn everything about multithreading, its real-life usage, thread lifecycle, thread pool, etc.
1. JavaのスレッドとRunnable
ThreadクラスとRunnableインターフェースについての最初の投稿です。また、ProcessとThreadについても学びます。ThreadとProcessの違い、スレッドの利点、およびRunnableインターフェースとThreadクラスを使用してスレッドを作成する方法についても説明します。この投稿ではまた、RunnableインターフェースとThreadクラスを比較します。
2. Javaスレッドスリープ
Javaスレッドスリープは、現在のスレッドの実行を一時停止するために使用されます。将来の投稿でThreadスリープを広範に使用するため、その動作方法と正確性を知っておくと良いですか?
3. Javaスレッドの結合
他のスレッドが実行を終了するのを待つ必要がある場合があります。これはThread結合メソッドを使用して実現できます。その動作方法と使用するタイミングについて学びましょう。
4. Java スレッドの状態
スレッドの異なる状態を理解することは重要です。スレッドがどのように状態を変更するか、およびオペレーティングシステムのスレッドスケジューラがスレッドの状態を変更する方法を学習します。
5. Java スレッドのwait、notify、notifyAll
Java Object クラスには、リソースのロック状態を通知するための3つのメソッドが含まれています。これらの Object クラスのメソッドの使用例を示したシンプルな Wait-Notify 実装を学習します。
6. スレッドセーフティと同期
スレッドがオブジェクトリソースを共有することを知っていますが、これらの操作はアトミックではないため、データの破損につながる可能性があります。異なる方法を使用して、Javaでスレッドセーフを実現する方法について学びましょう。この投稿を読んで、同期、同期されたメソッド、および同期されたブロックの正しい使用方法について学びます。
7. Javaのメインスレッドでの例外
JVMは`main`メソッドを使用して最初のスレッドを作成します。この投稿では、日常生活でよく見るいくつかの一般的な例外とそれらの原因、および修正方法について説明します。
8. シングルトンクラスのスレッドセーフティ
この記事では、シングルトンクラスの基本的な概念を学びます。さまざまな実装でのスレッドセーフティの問題は何ですか?シングルトンクラスでスレッドセーフティをどのように実現できるかについても学びます。
9. Javaにおけるデーモンスレッド
A simple article explaining daemon threads and how we can create daemon threads in java.
10. Javaスレッドローカル
われわれは、スレッドがオブジェクトの変数を共有することを知っていますが、クラスレベルでスレッドローカル変数を持ちたい場合はどうなるでしょうか。JavaはThreadLocalユーティリティクラスを提供しており、スレッドローカル変数を作成することができます。JavaプログラムでThreadLocal変数を作成する方法について詳しく知るためには、さらに読んでください。
11. Javaスレッドダンプ
Javaスレッドダンプは、現在のスレッドの情報を提供します。スレッドダンプは、アプリケーションのパフォーマンス問題を分析するのに役立ちます。スレッドダンプを使用してデッドロックの状況を見つけて修正できます。この投稿では、Javaでスレッドダンプを生成するために使用できるさまざまなメソッドについて説明します。
12. Javaでデッドロックを分析する方法
デッドロックは、複数のスレッドがリソースを解放するのを待ってお互いに待ち続ける状況であり、循環依存を引き起こします。この記事では、Javaプログラムでデッドロックが発生する状況と、スレッドダンプを使用してデッドロックを見つける方法、およびJavaプログラムでデッドロックを回避するためのベストプラクティスについて説明します。
13. Javaタイマースレッド
この投稿では、JavaタイマーとTimerTaskクラスを使用してスケジュールされた間隔でジョブを実行し、その使用例、およびタイマーをキャンセルする方法を示します。
14. Javaプロデューサーコンシューマー問題
Java 5より前では、プロデューサー・コンシューマー問題はwait()とnotify()メソッドを使用して解決できましたが、BlockingQueueの導入により非常に簡単になりました。BlockingQueueを使用してJavaでプロデューサー・コンシューマー問題を解決する方法について学びましょう。
15. Javaスレッドプール
Javaスレッドプールは、ジョブを処理するために待機しているワーカースレッドのコレクションです。Java 5のExecutorフレームワークの導入により、Javaでスレッドプールを作成するのが非常に簡単になりました。 ExecutorsおよびThreadPoolExecutorクラスを使用して、スレッドプールを作成および管理できます。
16. Java Callable Future
時々、スレッドが使用できる値を返すことを望むことがあります。Java 5のCallableは、そのような場合に使用できます。これは、Runnableインターフェースと似ています。 Executorフレームワークを使用してCallableタスクを実行できます。
17. Java FutureTask の例
FutureTask クラスは、Future インターフェースを実装した基本の具象クラスです。これを Callable 実装および Executors と共に使用して非同期処理を行います。FutureTask クラスは、タスクの状態を確認し、処理が完了したら呼び出し元プログラムに値を返すための実装メソッドを提供します。Future インターフェースのいくつかの実装メソッドをオーバーライドしたい場合に便利です。
結論
マルチスレッディングは非常に広範なトピックであり、1つの投稿ですべてを説明することは不可能でした。上記の投稿を順番に読むと、Java におけるマルチスレッディングについてすべて学ぶことができます。
Source:
https://www.digitalocean.com/community/tutorials/multithreading-in-java