我triyng實驗多線程編程(新的我),我有一些問題。如何正確使用線程池並從線程中獲取結果?
我正在使用ThreadPoolTaskExecutor
與TestTask實現Runnable
和run
方法睡眠X秒。 Everyting進行得很順利,我所有的TestTask都在不同的線程中執行。好。 現在棘手的部分是我想知道在線程中進行的操作的結果。所以我讀了一些谷歌/堆棧/等東西,我試圖使用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中,但這是我第一次嘗試使用不同的線程,所以我對我來說很新。
我在做什麼錯了?
謝謝!