ホームページ  >  記事  >  Java  >  Java マルチスレッドを規則的に実行するいくつかのメソッドのサンプル コード

Java マルチスレッドを規則的に実行するいくつかのメソッドのサンプル コード

黄舟
黄舟オリジナル
2017-03-18 10:19:081625ブラウズ

この記事は主に、Java マルチスレッドの秩序ある実行のいくつかの方法の概要に関する関連情報を紹介します。必要な友人はそれを参照してください

Java マルチスレッドの秩序ある実行のいくつかの方法の概要

私はこの問題を 2 つの方法で個人的に実践してきました。もちろん、もっと良い方法があることは間違いありません。

方法 1

import java.util.concurrent.atomic.AtomicInteger;

public class OrderedThread1 {
 
 static AtomicInteger count = new AtomicInteger(0);

 public static void main(String[] args) throws InterruptedException {
 Task task1 = new Task(count, 0);
 Task task2 = new Task(count, 1);
 Task task3 = new Task(count, 2);
 Thread thread1 = new Thread(task1);
 Thread thread2 = new Thread(task2);
 Thread thread3 = new Thread(task3);
 thread1.setDaemon(true);
 thread2.setDaemon(true);
 thread3.setDaemon(true);
 thread1.start();
 thread2.start();
 thread3.start();
 
 Thread.sleep(1 * 1000);
 }

}

class Task implements Runnable {
 
 private AtomicInteger count;
 private int order;
 
 public Task(AtomicInteger count, int order) {
 this.count = count;
 this.order = order;
 }

 @Override
 public void run() {
 while (true) {
  if (count.get() % 3 == order) {
  System.out.println(Thread.currentThread().getName() + " ===== "+ order);
  count.incrementAndGet();
  }
 }
 }
}

この方法は、より一般的な解決策であるはずです。アトミック インクリメントを使用してスレッド アドミッション順序を制御します。

方法 2

public class OrderedThread2 {
 static Holder holder = new Holder();
 public static void main(String[] args) throws InterruptedException {
 
 Task1 task1 = new Task1(holder, 0);
 Task1 task2 = new Task1(holder, 1);
 Task1 task3 = new Task1(holder, 2);
 Thread thread1 = new Thread(task1);
 Thread thread2 = new Thread(task2);
 Thread thread3 = new Thread(task3);
 thread1.setDaemon(true);
 thread2.setDaemon(true);
 thread3.setDaemon(true);
 thread1.start();
 thread2.start();
 thread3.start();
 
 Thread.sleep(1 * 1000);
 

 }

}

class Task1 implements Runnable {
 
 Holder holder;
 int order;
 
 public Task1(Holder holder, int order) {
 this.holder = holder;
 this.order = order;
 }

 @Override
 public void run() {
 while (true) {
  if (holder.count % 3 == order) {
  System.out.println(Thread.currentThread().getName() + " ===== "+ order);
  holder.count ++;
  }
 }
// int i = 0;
// while(i ++ < 10000){
//  holder.count ++;
// }
 }
}
class Holder {
 volatile int count = 0;
}

方法 2 では、volatile キーワードを使用します。各スレッドに最新のカウント値を取得させます。スレッドの 1 つが ++ 操作を実行すると、他の 2 つのスレッドは最新の値を取得し、許可条件が満たされているかどうかを確認します。

追記: volatile はスレッドセーフではありません。そして両者は何の関係もありません。揮発性変数はユーザー スレッドにコピーを保持しないため、すべてのスレッドに最新の値を提供します。しかし、想像してみてください。複数のスレッドが同時にこの変数を更新すると、最後の更新によって以前の更新がすべて上書きされ、スレッドのセキュリティが低下することは明らかです。方法 2 では、一度に 1 つのスレッドだけが許可条件を満たす ため、変数への同時更新はありません。 volatile 値を最新の状態に保つことは、スレッドの安全性とはまったく無関係であるため、同時実行制御の実装に volatile を悪用しないでください。

以上がJava マルチスレッドを規則的に実行するいくつかのメソッドのサンプル コードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。