以下は、ExecutorService
,Callable
、およびFuture
クラスを学習するときの熟語として使用した2つの単純なクラスです。
あなたは私がサイズ2のスレッドプールを使用して、私が処理する必要がある10個のアイテムを持っていることがわかります。基本的には、スレッドプールを作成し、Callable
を実装するクラスを渡し、結果としてFuture
を処理の証明として使用します。サイズ2のスレッドプールがある場合、一度に処理できるアイテムは2つだけです。結果を表示するには、値を変更できます。
Main.java:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Main {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
List<Future<String>> lst = new ArrayList<Future<String>>();
for (int i = 0; i < 10; ++i) {
Callable<String> callable = new Calling();
Future<String> future = executorService.submit(callable);
lst.add(future);
}
int futureCount = 0;
for (Future<String> fut : lst) {
try {
futureCount++;
System.out.println("Processed call() in thread " + fut.get() + ", future number: " + futureCount);
} catch (Exception e) {
e.printStackTrace();
}
}
executorService.shutdown();
while (!executorService.isTerminated()) {
// wait, basically
}
System.out.println("Finished all threads!");
}
}
Calling.java
import java.util.concurrent.Callable;
public class Calling implements Callable<String> {
public Calling() {
}
public String call() throws InterruptedException {
System.out.println("Sleeping thread: " + Thread.currentThread().getName());
Thread.sleep(2000);
return Thread.currentThread().getName();
}
}
ありがとうございます!私の質問に答えられたように見えます。 –