ホームページ  >  記事  >  Java  >  Java が ExecutorService を使用して多数のスレッドを同期的に実行する方法の詳細な説明 (図)

Java が ExecutorService を使用して多数のスレッドを同期的に実行する方法の詳細な説明 (図)

黄舟
黄舟オリジナル
2017-03-28 10:24:592027ブラウズ

この記事では、Java が ExecutorService を使用して多数のスレッドを同期的に実行する方法を主に紹介します。ExecutorService は、重要なリソースを操作するときに多数のスレッドの安定性を維持します。

Java 1.5 以降、公式 Web サイトで Executor のようなクラスが開始されました。このクラスは、重要なリソースを操作するときに多数のスレッドの安定性を維持できます。
コードの一部から始めましょう:

TestRunnable.java

public class TestRunnable implements Runnable {
  private String name;

  public TestRunnable(String name) {
    this.name = name;
  }

  @Override
  public void run() {
    while (true) {
      if (Main.Surplus < 0)
        return;
      Main.Surplus--;
      System.out.println(name + " " + Main.Surplus);
    }
  }
}

main入口

public static void main(String[] args) {

     TestRunnable runnable = new TestRunnable("runnable1");
     TestRunnable runnable2 = new TestRunnable("runnable2");

     Thread t1 = new Thread(runnable);
     Thread t2 = new Thread(runnable2);

     t1.start();
     t2.start();

  }

このようにして、もちろん、この時点でデータがめちゃくちゃになっていることが分かります。 synchronized キーワード、しかし、これはいくつかの小さな問題も引き起こします

次に、この問題を解決するために Java 組み込みのスレッド管理メカニズムを使用する予定です。スレッド プールがある場合、操作をリクエストすると、すべての操作がスレッド プールに入り、1 つのスレッドだけが開かれるため、リクエストは順番に実行され、重要なリソースは順番に呼び出すことができ、非常に安全です。

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Main {
  public static int Surplus = 10;

  private ExecutorService executor = Executors.newSingleThreadExecutor();

  void addTask(Runnable runnable) {
    executor.execute(runnable);
  }

  <V> V addTask(Callable<V> callable) {
    Future<V> submit = executor.submit(callable);
    try {
      return submit.get();
    } catch (InterruptedException e) {
      System.out.println("InterruptedException" + e.toString());
    } catch (ExecutionException e) {
      System.out.println("ExecutionException" + e.toString());
    }
    return null;
  }

  public void testAddTask(String name) {
    addTask(new Runnable() {
      @Override
      public void run() {
        for (int i = 0; i < 3; i++) {
          if (Main.Surplus <= 0)
            return;
          Main.Surplus--;
          System.out.println(name + " " + Main.Surplus);
        }

      }
    });
  }

  public void testAddTask2(String name) {
    int count = addTask(new Callable<Integer>() {
      @Override
      public Integer call() throws Exception {
        for (int i = 0; i < 3; i++) {
          if (Main.Surplus <= 0)
            return 0;
          Main.Surplus--;
          System.out.println(name + " " + Main.Surplus);
        }
        return Main.Surplus;
      }
    });

  }

  public void close() {
    executor.shutdown();
  }

  public static void main(String[] args) {
    Main main = new Main();
    main.testAddTask("task1");
    main.testAddTask2("task2");
    main.testAddTask("task3");
    main.testAddTask2("task4");
    main.close();
  }
}
ここでは、ジェネリック型の addTask と addTask という 2 つのメソッドを定義しています。これら 2 つのメソッドの実装原理は同じです。1 つはコールバックを持ち、もう 1 つはコールバックを持ちません。プロジェクトの要件を確認してください。

次に、これら 2 つのメソッドをそれぞれ呼び出します。結果は非常に秩序正しく、混沌としていないことがわかります。

以上がJava が ExecutorService を使用して多数のスレッドを同期的に実行する方法の詳細な説明 (図)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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