早速本題へ
IT 界では、同時実行性について話すときは必ず、コンピューター上で同時に実行される一連のスレッドについて話します。このコンピュータに複数のプロセッサまたはマルチコア プロセッサが搭載されている場合、実際には「同時に実行」されますが、コンピュータにシングル コア プロセッサしか搭載されていない場合、「同時実行」は単なる見かけにすぎません。
最新のオペレーティング システムはすべて、タスクの同時実行をサポートしています。最初のメールを遅らせることなく、オンラインで音楽を聴いたり、ニュースを読んだりできます。この同時実行性はプロセスレベルの同時実行性であると言えます。プロセス内では、多くの同時タスクがあることもわかります。プロセス内で実行される同時タスクをスレッドと呼びます。
並行性に関連するもう 1 つの一般的な概念は並列処理です。同時実行と並列処理の間には、いくつかの違いといくつかの関連性があります。一部のプログラマ (著者、「プログラマ」と音訳) は、シングルコア プロセッサ上で複数のスレッドを使用してアプリケーションを実行することが同時実行であると信じており、さらに、プログラムが複数のスレッドで実行されるとき、スレッドが実行されるときを観察することができます。マルチプロセッサまたはマルチコアプロセッサでは、それらは並列になります。アプリケーションのスレッドが事前に設定された順序で実行されない場合、それが同時実行であると考えるプログラマもいます。問題の解決を簡略化するために、スレッドが使用され、これらのスレッドが特定の順序で実行されます。これが並列処理です。
この章では、12 の例を使用して、Java7 API を使用していくつかの基本的なスレッド操作を実行する方法を示します。 Java プログラムでスレッドを作成および実行する方法、スレッドの実行を制御する方法、スレッドのグループを 1 つの単位として操作する方法などを理解できるようになります。
このセクションでは、Java プログラムでスレッドを作成する方法とそれを実行する方法を学びます。 Java プログラムでは、すべてがオブジェクトであり、スレッドも同様です。スレッドを作成するには 2 つの方法があります。
1. Thread クラスを継承し、run() メソッドをオーバーライドします。
2. Runnable インターフェイスを実装するクラスを作成し、次に Thread クラスのオブジェクトを作成し、Runnable インターフェイスを実装するクラスのインスタンスをパラメータとして Thread クラスのインスタンスに渡します。
このセクションでは、2 番目の方法を使用して 10 個のスレッドを作成し、実行します。各スレッドは、10 以内の 2 つの整数の積を計算して出力します。
それを知っています
この例を実装するには、以下の手順に従ってください。
1. Calculator という名前のクラスを作成し、Runnable インターフェイスを実装します。コードは次のとおりです。
次のようにコードをコピーします。
public class Calculator は Runnable {を実装します。
2.number という名前のプライベート整数属性を宣言し、このクラスのコンストラクターを実装して、宣言したばかりの属性を初期化します。コードは次のとおりです。
次のようにコードをコピーします。
プライベート整数;
public Calculator(int 数値) {
this.number = 数値;
}
3. run()メソッドを実装します。これは作成したスレッドの実行時に実行されるプログラム(命令)であり、このメソッドを使用して九九を計算します。具体的なコードは次のとおりです。
次のようにコードをコピーします。
@オーバーライド
public void run() {
for (int i = 0; i < 10; i++) {
System.out.printf("%s: %d * %d = %d/n",
Thread.currentThread().getName()、
数値、i、i * 数値);
}
}
4. 次に、サンプル アプリケーションのメイン クラスを実装します。 Main という名前のクラスを作成し、そのクラスに main メソッドを追加します。コードは次のとおりです。
次のようにコードをコピーします。
パブリッククラス Main {
public static void main(String[] args) {
5. main() メソッド内で、10 回実行する for ループを作成します。ループ本体で、Calculator クラスのオブジェクト計算機を作成し、Thread クラスのオブジェクト スレッドを作成し、その計算機をパラメータとして渡します。スレッドの初期化ステートメントにコンストラクターを追加します。最後に、スレッド オブジェクトの start() メソッドを呼び出します。コードは次のとおりです。
次のようにコードをコピーします。
for (int i = 0; i < 10; i++) {
電卓 電卓 = 新しい電卓(i);
スレッド thread = 新しいスレッド(計算機);
thread.start();
}
6. このプログラムを実行して、さまざまなスレッドがどのように同時に実行されるかを確認します。
理由を知っています
以下は、プログラムの実行時にコンソールに出力される出力です。作成したすべてのスレッドが同時に実行されていることがわかります。
次のようにコードをコピーします。
スレッド 3: 3 * 5 = 15
スレッド 0: 0 * 2 = 0
スレッド 3: 3 * 6 = 18
スレッド 1: 1 * 6 = 6
スレッド 1: 1 * 7 = 7
スレッド 3: 3 * 7 = 21
スレッド 3: 3 * 8 = 24
スレッド 0: 0 * 3 = 0
スレッド 0: 0 * 4 = 0
スレッド 3: 3 * 9 = 27
スレッド 1: 1 * 8 = 8
すべての Java プログラムは少なくとも 1 つのスレッドを実行します。 Java プログラムを実行すると、Java 仮想マシン (以下、JVM と呼びます) がスレッドを実行し、main() メソッドを含むプログラムを呼び出します。
Thread オブジェクトの start() メソッドが呼び出されると、別のスレッドが作成されます。 start() メソッドが呼び出される回数、作成されるスレッドの数。
すべてのスレッドの実行が完了すると、Java プログラムは終了します。 (特別な状況がない限り、デーモン以外のスレッドはすべて実行されます。) 開始スレッド (main() メソッドを実行するスレッドなど) が終了すると、残りのスレッドは計算タスクが完了するまで実行を続けます。いずれかのスレッドが System.exit() を呼び出し、JVM にプログラムの終了を要求すると、すべてのスレッドが実行を終了します。
Thread オブジェクトの run() メソッドが呼び出された場合、スレッドは作成されません。同様に、Runnable インターフェイスを実装するクラスの run() メソッドが呼び出された場合、スレッドは作成されません。スレッドは、Thread オブジェクトの start() メソッドが呼び出された場合にのみ作成されます。
終わりのない
このセクションの冒頭で述べたように、スレッドを作成する別の方法もあります。Thread クラスを継承し、run() メソッドをオーバーライドすることで、Thread サブクラスのオブジェクトを作成し、start() を呼び出すことができます。オブジェクトのメソッドでスレッドを作成します。
次のようにコードをコピーします。
面接の準備をしていたので、この「Java 7 Concurrency Cookbook」を含む Java マルチスレッドに関する情報をたくさん見つけました。説明が非常にシンプルで分かりやすいので、知らない友人にも最適です。マルチスレッドについては詳しく知りたいが、真剣に学びたいと考えています。探しても中国語版は見つからなかったので、食料や衣類は自分で作ることにしました。そこで、非公式翻訳を公開する予定で、タイトルは仮題「Java7同時実行例集」とさせていただきます。
ドクトリンを使用する
この記事は「Java 7 Concurrency Cookbook」(D Gua Ge が「Java7 Concurrency Example Collection」として盗用しました) を翻訳したものであり、学習教材としてのみ使用されます。許可なく商業目的で使用することはできません。
小さな成功
元の本には完全なコードがないため、閲覧には不便です。したがって、D Gua 兄弟は、このセクションに示されているコードの完全なバージョンを示すセクションを追加しました。
Calculator クラスの完全なコードは次のとおりです。
パッケージ com.diguage.books.concurrencycookbook.chapter1.recipe1;
/**
* 日付: 2013-09-13
* 時間: 21:42
*/
public class Calculator は Runnable {を実装します。
プライベート整数;
public Calculator(int 数値) {
this.number = 数値;
}
@オーバーライド
public void run() {
for (int i = 0; i < 10; i++) {
System.out.printf("%s: %d * %d = %d/n",
Thread.currentThread().getName()、
数値、i、i * 数値);
}
}
}
Mainクラスの完全なコード
次のようにコードをコピーします。
パッケージ com.diguage.books.concurrencycookbook.chapter1.recipe1;
/**
* 日付: 2013-09-13
※時間:19:46
*/
パブリッククラス Main {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
電卓 電卓 = 新しい電卓(i);
スレッド thread = 新しいスレッド(計算機);
thread.start();
}
}
}