ホームページ >Java >&#&チュートリアル >Java が ExecutorService を使用して多数のスレッドを同期的に実行する方法の詳細な説明 (図)
この記事では、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 つはコールバックを持ちません。プロジェクトの要件を確認してください。
以上がJava が ExecutorService を使用して多数のスレッドを同期的に実行する方法の詳細な説明 (図)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。