私はマルチスレッド プログラミング (私にとっては新しい) を実験しようとしていますが、いくつか質問があります。
私は、ThreadPoolTaskExecutor
実装する TestTask とX 秒間スリープRunnable
するメソッドを使用しています。run
すべてがスムーズに進み、すべての TestTask が別のスレッドで実行されました。Ok。ここで難しいのは、スレッドで行われた操作の結果を知りたいということです。だから私はGoogle/stack/etcでいくつかのものを読んで、使用しようとしましたFuture
. そして、それはもううまく機能していません:/
メソッドを使用してget
メソッドの結果を取得し(本当に?)、call
その部分は機能していますが、TestTaskは次々に実行されます(以前のように同時にではありません)。だから私は何かを正しく理解していなかったと思いますが、何がわからないのですか...そしてそれがあなたの助けが必要な理由です!
テストを起動するクラス:
public void test(String test) {
int max = 5;
for (int i = 0; i < max; i++) {
TestThreadService.launch(i);
}
System.out.println("END");
}
TestThreadService クラス:
public class TestThreadService {
private ThreadPoolTaskExecutor taskExecutor;
public void launch(int i) {
System.out.println("ThreadNumber : "+i);
taskExecutor.setWaitForTasksToCompleteOnShutdown(false);
TestTask testTask = new TestTask(i);
FutureTask<Integer> futureOne = new FutureTask<Integer>(testTask);
taskExecutor.submit(futureOne);
try {
Integer result = futureOne.get();
System.out.println("LAUNCH result : "+i+" - "+result);
} catch (Exception e) {
e.printStackTrace();
}
}
public void setTaskExecutor(ThreadPoolTaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}
}
そして TestTask クラス:
public class TestTask implements Callable<Integer> {
public Integer threadNumber;
private Integer valeur;
public TestTask(int i) {
this.threadNumber = i;
}
public void setThreadNumber(Integer threadNumber) {
this.threadNumber = threadNumber;
}
@Override
public Integer call() throws Exception {
System.out.println("Thread start " + threadNumber);
// generate sleeping time
Random r = new Random();
valeur = 5000 + r.nextInt(15000 - 5000);
System.out.println("Thread pause " + threadNumber + " " + valeur);
try {
Thread.sleep(valeur);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread stop" + threadNumber);
return this.valeur;
}
}
私はJavaが苦手ではありませんが、別のスレッドを使用しようとするのはこれが初めてなので、私にとっては新しいことです。
私は何を間違っていますか?
ありがとう !