我开始使用执行程序服务,我想知道在完成任务时我将如何调用函数。我已经看到了这个函数http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html#isDone--
但我不知道如何连接它来调用我的代码中的函数endoftheroad()
这是我的代码
//import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//import java.util.concurrent.Future;
//import java.util.concurrent.TimeUnit;
import java.util.*;
public class Pooler {
public static int add(int x, int y){
int c = x + y;
return c;
}
public static int endoftheroad(){
int the_end = 0;
return the_end;
}
public static void main(String args[]) {
ExecutorService service = Executors.newFixedThreadPool(10);
for (int i =0; i<100; i++){
Random randomno = new Random();
int value = randomno.nextInt();
service.submit(new Task(add(value,value)));
}
}
}
final class Task implements Runnable{
private int taskId;
public Task(int id){
this.taskId = id;
}
@Override
public void run() {
System.out.println("Task ID : " + this.taskId +" performed by "
+ Thread.currentThread().getName());
}
}
答案 0 :(得分:0)
这很简单,当前任务完成后会向执行程序提交一个新任务:
public void run() {
doSomeStuff();
executor.submit(new FinishHimTask());
}
但是你应该记住,如果提交的任务非常小,那么在当前线程中执行它可能会更高效,因为创建和向Executor添加新任务也需要一些时间。
答案 1 :(得分:0)
您的费用有问题
a)add
在当前线程中执行。除了打印输出之外没有任何内容在执行程序线程中执行。
b)道路功能的结束没有做任何事情,所以无论是否被调用都无关紧要。
c)你忽略了Future使用它变得困难。
要回答您的问题,您可以在Java 8中使用CompleableFuture。但是,更简单的解决方案是;
答案 2 :(得分:0)
如果您的代码需要在Java 7下运行,请查看Google的guava库中的ListenableFuture
。如果使用guava是您的选项,ListenableFuture
类可提供您所需的内容。 https://code.google.com/p/guava-libraries/wiki/ListenableFutureExplained有一个教程。
如果你有Java 8,JDK的CompletableFuture是另一种选择。