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

在线程中标记未来对象

穆招
2023-03-14

我有一个for循环,在这个循环中,我调用db来获取学生的一些值。现在for loop需要很多时间。所以我想用未来对象的执行器服务来代替它。在函数开始时,我使用executor调用db。submit()方法。我只是不确定如何找到未来返回的对象是针对那个特定的学生的,我可以使用这些对象进行进一步的步骤。请查找下面的代码

下面的函数是从for循环调用的,自每个学生调用该函数以来,总的来说需要花费大量时间:

public void getDbDetails(String student){
       //calling db
       if(dbDetails.studentName = "XYZ"){
          //function based on student ID
       }
}

使用Executor框架:

public void getStudentData(List<String> students){
   final List<Future<?>> futures = new ArrayList<>();
        for(String student: students){
            Future<?> future = executor.submit(() ->{
                //db call
            });
            futures.add(future);
        }
}

public void getDbDetails(String student){
//In this case how would i know whether future has returned details for this particular student??
if(dbDetails.studentName = "XYZ"){
              //function based on student ID
           }
}

是否可以使用future。get()并基于future对象的studentId创建一个映射,然后在函数getDbDetails()中使用该映射来获取特定的学生信息,如果future当时没有返回任何信息,则使用线程。等待() ?这种方法是正确的还是其他任何方法都可以作为最佳解决方案

共有1个答案

王泓
2023-03-14

主要问题是任务的返回值为void。相反,您应该定义一个可调用的返回值。

一些未经测试的代码的草稿:

public class StudentNameLookup implements Callable < String >
{
    private String studentId ;
    
    public StudentNameLookup ( String studentId ) 
    {
        this.studentId = studentId ;
    }
    
    public String call()
    {
        String studentName ;
        // … DB call, passing this.studentId.
        return studentName ;
    }
}

作为品味的问题,我会建立一个任务列表。

List < Callable < String > > tasks = new ArrayList<>();
for( String studentId : studentIds )
{
    Callable < String > task = new StudentNameLookup( studentId ) ;
    tasks.add( task ) ;
}

您的期货的参数化类型(尖括号)将是该返回值的类型。

 类似资料:
  • 我如何使用异步EJB的和要求结果与未来的对象?谁能给我一个完整的例子。

  • 我想用Java 8-9启动线程,使用异步模式,这些是我的类和我的线程: 我有三根线。我的类包含单个方法 按以下方式设置我的%s: 正在创建线程: 最后,我的问题是我如何使用异步模式启动这三个线程。

  • 我正在尝试将标记对象用于我的flatter插件。使用MethodChannel,我可以调用Java函数,但我的标记对象仍然为null。我如何正确地创建此意图? 我的猜测是不能以这种方式创建意图,这就是为什么它为标记返回空对象的原因。

  • 我试图在传单中的标记(从JSON数据生成)之间插入行。我看到了一个示例,但它不能使用JSON数据。我能看到标记,但没有线条出现。 我的JSON数据:

  • 问题内容: 出于好奇,为什么< img >标签没有在 HTML中 关闭? 我还注意到,< img >标记在 XHTML中 已显式关闭。 问题答案: 从历史上看,HTML一直基于SGML,它允许在某些情况下省略标签。 由于元素不能有任何子节点,因此将其定义为EMPTY,并且禁止使用end标签(因为它将毫无用处)。 XHTML是用XML表示的HTML,并且XML不支持可选或禁止的标签(尽管它允许使用自

  • 文件范围的元数据 reST 有字段列表”field lists” 的概念; 字段序列如下: :fieldname: Field content 文件开端的字段列表会被文档工具解释为文档源信息,通常记录了作者,出版日期等元数据. 在Sphinx中, 在所有标记前面的字段列表将作为文档元数据放在Sphinx 环境中,不显示在输出文档中; 在文档标题后的字段列表仍然是文档源信息的一部分显示在输出文档中.