この記事では、Java スレッド同期の実装方法を詳しく説明します (コード付き)。必要な方は参考にしてください。
スレッド同期の理由
ファイルなどの同じリソース上で複数のスレッドが動作している場合、複数のスレッドが同時に動作することを許可することはできません。このファイル。ファイルを共有すると、複数の操作が競合するためです。チーム開発に git を使用したことがある人は、価格比較について深い経験があると思います。
現時点では、スレッド同期メカニズムを導入する必要があります。
いわゆる同期とは、1 つずつ実行すること、つまり、複数のスレッドが実行のためにキューに入れられることを指し、スレッド間には先着順の関係が存在します。そうすれば、争いや紛争はなくなります。
問題の説明
2 つのスレッドを持つプログラム。最初のスレッドは偶数と 2 から 1000 までの数値を計算し、2 番目のスレッドは 1000 を計算します。偶数と数値。 ~2000年の間。
初期実装
まず、テーマに応じて実装方法を設計します。
1. 2 つのスレッドを定義します。ここでは、独自のスレッド クラスを定義し、偶数の計算の開始と終了を設定する必要があります
2。指定された範囲内の偶数の計算を実装します
##3。 #実装が簡単であることがわかります。暫定的な実装は次のとおりです:
public class MyTread extends Thread {
private int begin; // 范围开始
private int end; // 范围结束
public MyTread(int begin, int end) {
this.begin = begin;
this.end = end;
}
}
@Override public void run() { this.getEven(begin, end); } // 获取偶数以及个数 private void getEven(int begin, int end) { int count = 0; System.out.println(begin + "~" + end + "之间的偶数为:"); if (begin % 2 != 0) { begin += 1; } for (; begin <strong></strong>3. スレッドを初期化して実行します。 <p></p><pre class="brush:php;toolbar:false">public static void main(String[] args) { MyTread tread1 = new MyTread(2, 500); MyTread tread2 = new MyTread(500, 1000); tread1.start(); tread2.start(); }
その後の効果を確認するために、数値範囲が縮小されます。 結果を見てください:
は私たちが望んでいた効果ではないようです。この効果が必要です:
各パーツの偶数と偶数を一緒にしたいのですが、実装後の効果は確かに 2 です。混乱の部分が生じます。
プログラムの改善
上記の問題を解決するには、最初に説明した スレッド同期
を使用する必要があります。最初の紹介によると、同期の条件の 1 つは、
共有リソース
共有リソース とは何でしょうか?そうではないようです。したがって、最初に作成します。
1. 共有リソースの作成
ここにある共有リソースは 同じオブジェクト
である可能性があるため、別のクラスを作成します。共有リソースを示します。public class Even {}
2. 次に、共有クラスで偶数を計算するメソッドを作成します。 public class Even { /** * 获取某个范围内偶数以及个数 * @param begin 统计开始 * @param end 统计结束 */ public synchronized void getEven(int begin, int end) { int count = 0; System.out.println(begin + "~" + end + "之间的偶数为:"); if (begin % 2 != 0) { begin += 1; } for (; begin <strong> 注意深い人は、このメソッドがここで説明したメソッドとは少し異なることに気づくでしょう。最初に書いたものには、もう 1 つのキーワードがあります: </strong>synchronized。このキーワードにより、メソッドの実行時にスレッドの同期を実現できます。 <p><code></code>3. 最後に、スレッド </p><p></p><pre class="brush:php;toolbar:false">public class MyTread extends Thread { Even even; @Override public void run() { even.getEven(begin, end); } }
望んでいた効果が得られました。
最後に、完全なコードを添付します:/** * 偶数类 */ public class Even { /** * 获取某个范围内偶数以及个数 * @param begin 统计开始 * @param end 统计结束 */ public synchronized void getEven(int begin, int end) { int count = 0; System.out.println(begin + "~" + end + "之间的偶数为:"); if (begin % 2 != 0) { begin += 1; } for (; begin <p></p>
以上がJavaスレッド同期の実装方法を詳しく解説(コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。