これは、特定の配列の値の所定の範囲を処理するスレッドを作成し、実行の基本的な概念を示して非常に基本的な例です。この例では、いくつかの前提があります(たとえば、偶数の要素のみ)。例も少し長い息切れされるので、意図的に行われ、
import java.util.Random;
public class ThreadExample {
public static void main(String[] args) {
int[] numbers = new int[100000];
Random rnd = new Random();
for (int index = 0; index < numbers.length; index++) {
numbers[index] = rnd.nextInt();
}
Thread[] threads = new Thread[10];
Worker[] workers = new Worker[10];
int range = numbers.length/10;
for (int index = 0; index < 10; index++) {
int startAt = index * range;
int endAt = startAt + range;
workers[index] = new Worker(startAt, endAt, numbers);
}
for (int index = 0; index < 10; index++) {
threads[index] = new Thread(workers[index]);
threads[index].start();
}
boolean isProcessing = false;
do {
isProcessing = false;
for (Thread t : threads) {
if (t.isAlive()) {
isProcessing = true;
break;
}
}
} while (isProcessing);
for (Worker worker : workers) {
System.out.println("Max = " + worker.getMax());
}
}
public static class Worker implements Runnable {
private int startAt;
private int endAt;
private int numbers[];
private int max = Integer.MIN_VALUE;
public Worker(int startAt, int endAt, int[] numbers) {
this.startAt = startAt;
this.endAt = endAt;
this.numbers = numbers;
}
@Override
public void run() {
for (int index = startAt; index < endAt; index++) {
max = Math.max(numbers[index], max);
}
}
public int getMax() {
return max;
}
}
}
A、わずかに簡単な解決策の詳細はthe Concurrency Trailを見てとることで
スタートを必要とされるであろう基本的な手順を実証するための試みで、 ExecutorService
APIを使用すると、一連のCallable
をサービスに提供できるようになり、List
のFuture
が返されます。ここでの利点は、スレッドの状態をチェックし、絶えず必要としないように、すべてのCallable
秒まで戻りませんサービスは、完了した(または失敗した)、ある
あなたはおそらく開始することをお勧めします
import java.util.Arrays;
import java.util.List;
import java.util.Random;
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 ThreadExample {
public static void main(String[] args) {
int[] numbers = new int[100000];
Random rnd = new Random();
for (int index = 0; index < numbers.length; index++) {
numbers[index] = rnd.nextInt();
}
ExecutorService executor = Executors.newFixedThreadPool(10);
Worker[] workers = new Worker[10];
int range = numbers.length/10;
for (int index = 0; index < 10; index++) {
int startAt = index * range;
int endAt = startAt + range;
workers[index] = new Worker(startAt, endAt, numbers);
}
try {
List<Future<Integer>> results = executor.invokeAll(Arrays.asList(workers));
for (Future<Integer> future : results) {
System.out.println(future.get());
}
} catch (InterruptedException | ExecutionException ex) {
ex.printStackTrace();
}
}
public static class Worker implements Callable<Integer> {
private int startAt;
private int endAt;
private int numbers[];
public Worker(int startAt, int endAt, int[] numbers) {
this.startAt = startAt;
this.endAt = endAt;
this.numbers = numbers;
}
@Override
public Integer call() throws Exception {
int max = Integer.MIN_VALUE;
for (int index = startAt; index < endAt; index++) {
max = Math.max(numbers[index], max);
}
return max;
}
}
}
[Concurrency Trail](https://docs.oracle.com/javase/tutorial/essential/concurrency/)を見てください。単に 'new Thread()'を作成するだけで、実際には何もしません。考慮する必要があることの1つは、指定された配列の範囲内で最大の値を見つけるスレッドを作成することです。そうすれば(あなたの場合)10個の値(各スレッドから1つ)が得られます。最大値がどれかを決定します。 – MadProgrammer
ああ、それぞれのスレッドが1/10を探索します。次に、各スレッドが見つけた値を比較しますか? – Vortex11
基本的には、各スレッドが完了したときなどを知る必要があるので少し複雑ですが、それは基本的な考えです。 – MadProgrammer