任务完成后调用函数

时间:2014-12-26 13:27:20

标签: java multithreading executorservice

我开始使用执行程序服务,我想知道在完成任务时我将如何调用函数。我已经看到了这个函数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());
    }

}

3 个答案:

答案 0 :(得分:0)

这很简单,当前任务完成后会向执行程序提交一个新任务:

public void run() {
  doSomeStuff();
  executor.submit(new FinishHimTask());
}

但是你应该记住,如果提交的任务非常小,那么在当前线程中执行它可能会更高效,因为创建和向Executor添加新任务也需要一些时间。

答案 1 :(得分:0)

您的费用有问题

a)add在当前线程中执行。除了打印输出之外没有任何内容在执行程序线程中执行。

b)道路功能的结束没有做任何事情,所以无论是否被调用都无关紧要。

c)你忽略了Future使用它变得困难。

要回答您的问题,您可以在Java 8中使用CompleableFuture。但是,更简单的解决方案是;

  • 在run()中移动循环中的所有代码。
  • 在run()方法结束时调用该函数以运行此代码。

答案 2 :(得分:0)

如果您的代码需要在Java 7下运行,请查看Google的guava库中的ListenableFuture。如果使用guava是您的选项,ListenableFuture类可提供您所需的内容。 https://code.google.com/p/guava-libraries/wiki/ListenableFutureExplained有一个教程。

如果你有Java 8,JDK的CompletableFuture是另一种选择。