当前位置: 首页 > 知识库问答 >
问题:

任务完成时调用函数

楚威
2023-03-14

我正在开始执行器服务,我想知道当任务完成时如何调用函数。我见过这个函数http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html#isDone--

但我不确定如何将其连接到我的代码中调用函数<code>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个答案

孟文栋
2023-03-14

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

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

沃瑾瑜
2023-03-14

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

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

但是,您应该记住,如果提交的任务是一个非常小的任务,那么在当前线程中执行它可能会更有性能,因为创建一个新任务并将其添加到执行器也需要一些时间。

何涵忍
2023-03-14

您的成本有问题

a) 添加在当前线程中执行。除了在executors线程中执行打印外,什么都不做。

b)道路结束功能不做任何事情,因此是否调用它并不重要。

c)你忽略了未来的回报,使得使用它变得困难。

要回答你的问题,你可以在Java 8中使用CompleableFuture。然而,更简单的解决方案是:

  • 将循环中的所有代码移动到run()中
  • 在run()方法的末尾调用函数以在该代码之后运行
 类似资料:
  •  说明 调用方法1: $.f2eAct.task(el,options); 函数说明: 该方法完成主要调用joinAndFinish完成任务,会根据接口返回的奖品类型显示不同文案,如卡玛、实物、谢谢参与等。 当获取的奖品数量大于1时,会默认触发 $(".js-package").click(); 事件,所以需要在JS里定义.js-package点击方法。 使用的时候需要在相应dom元素添加 da

  • 我正在从一个Spring Boot应用程序(在Java11中)同步调用一个REST API来下载一个文件。 这就是REST API的样子: 首先调用“/download”->API返回“文件生成正在进行”状态 所以,5秒后再调用它->API再次返回“文件生成正在进行”状态 因此,在5秒后再次调用它->API再次返回“文件生成正在进行”状态(但此时假定文件已生成) 因此,5秒后再调用一次->API返

  • 问题内容: 我试图实现的基本上是“重复完成渲染”处理程序。我能够检测到何时完成,但是我不知道如何从中触发功能。 检查小提琴:http : //jsfiddle.net/paulocoelho/BsMqq/3/ JS 的HTML 答 :从finishmove的工作提琴:http : //jsfiddle.net/paulocoelho/BsMqq/4/ 问题答案: 请注意,我没有使用,而是将其包装在

  • 问题内容: 我知道这个问题以前曾被问过,但是所有解决方案都不适合我。 我有一个将参数发送到API的函数,并以列表的形式返回数据。我有一个UITableView设置为使用该列表,但是它在列表分配给变量之前运行。 码: 如果不立即将其作为重复投票,我将不胜感激,这是我尝试的方法。 派遣组 信号量计时 运行变量 其中包括= self和= self 。 编辑:要求提取项目, 问题答案: 您不能-也不应该-

  • 首先,我是卡蒙达的新手。。我在camunda中创建了一个自定义任务列表。我可以申请/取消申请任务等,这是可行的。 现在我想完成一项任务,但是当我打电话的时候: 似乎camunda希望在此上下文中进入下一步,而不是部署BPMN模式以及部署执行下一步所需的一切的上下文。所以我得到了“classNotFound”异常,因为我的customTasklist中没有相同的类。战争就像卡蒙达处理器一样。战争 我

  • 本文向大家介绍用map函数来完成Python并行任务的简单示例,包括了用map函数来完成Python并行任务的简单示例的使用技巧和注意事项,需要的朋友参考一下 众所周知,Python的并行处理能力很不理想。我认为如果不考虑线程和GIL的标准参数(它们大多是合法的),其原因不是因为技术不到位,而是我们的使用方法不恰当。大多数关于Python线程和多进程的教材虽然都很出色,但是内容繁琐冗长。它们的确在