我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中,但这是我第一次尝试使用不同的线程,所以我对我来说很新。
我在做什么错了?
谢谢!