具有不同返回类型的变量可调用对象

2023-12-22

我手头的问题是我的方法one(), two(), three(), four()有不同的返回类型说,A, B, C, D我需要生成可变数量的线程(每个方法一个,具体取决于用例。这意味着我想一次调用方法的子集。)现在,我使用cachedThreadPool提交这些可调用对象。下面的一些代码:

public class Dispatcher {

  public void dispatch(List<MethodNames> methodNames) {
    //Now I am going to iterate through the list of methodNames
    //And submit each method to the `ExecutorService`
    for(MethodNames m : methodNames) {
      switch(m) {
        case ONE: //submit one()
                  //wait and get the future
                  Future<A> future = cachePool.submit(new Callable<A>() {
                    @Override
                    public A call() {
                      return one();
                    });
                  A response = future.get(); 
             break;
        ....
      }
    }
  }
}

public enum MethodNames {
  ONE, TWO, THREE, FOUR
}

//Example methods:
public A one() {
}

public B two() {
}

我的问题是如何执行上述操作,以便所有方法调用都无需等待一个方法调用完成。另外,如何收集所有futures并等待它们完成,因为所有期货都有不同的通用类型Future<A>, Future<B>等我打电话给submit()在 case 语句中,所以我无权访问返回的Future<T>案件之外。现在我可以做一个if, else而不是for循环,但我想弄清楚是否有更好的方法来实现这一点。


我会这样做 -

  • 创建一个界面,比方说I.
  • 上课A, B, C and D实施I.
  • 使用枚举valueOf和对象overriding删除 case 语句。
  • 使用多态并返回I从所有的方法。
  • 下面是代码(不包括A, B, C, D, I)因为它们是普通的类和接口 - 没有做太多事情。

下面是代码:

调度程序.java

package com.test.thread;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;

public class Dispatcher {

public void dispatch() throws InterruptedException, ExecutionException {
    Map<MethodNames, Future<I>> reponse = new HashMap<MethodNames, Future<I>>();
    ExecutorService cachePool = Executors.newCachedThreadPool();
    for (MethodNames methodNames : MethodNames.values()) {
        Future<I> future = cachePool.submit(methodNames.worker());
        reponse.put(methodNames, future);
    }
    cachePool.awaitTermination(5, TimeUnit.MINUTES);
    for(MethodNames key : reponse.keySet()) {
        I result = reponse.get(key).get();
        System.out.println("result :: " + result);
    }
}

public static void main(String[] args) throws InterruptedException, ExecutionException {
    new Dispatcher().dispatch();
}

}

方法名.java

package com.test.thread;

import java.util.concurrent.*;

public enum MethodNames {
ONE {
    @Override
    public Callable<I> worker() {
        return new Callable<I>() {
            @Override
            public I call() throws InterruptedException {
                System.out.println("Thread1");
                TimeUnit.SECONDS.sleep(30);
              return new A();
            }};
    }
},
TWO {
    @Override
    public Callable<I> worker() throws InterruptedException {
        return new Callable<I>() {
            @Override
            public I call() throws InterruptedException {
                System.out.println("Thread2");
                TimeUnit.SECONDS.sleep(30);
              return new B();
            }};
    }
},
THREE {
    @Override
    public Callable<I> worker() throws InterruptedException {
        return new Callable<I>() {
            @Override
            public I call() throws InterruptedException {
                System.out.println("Thread3");
                TimeUnit.SECONDS.sleep(30);
              return new C();
            }};
    }
},
FOUR {
    @Override
    public Callable<I> worker() throws InterruptedException {
        return new Callable<I>() {
            @Override
            public I call() throws InterruptedException {
                System.out.println("Thread");
                TimeUnit.SECONDS.sleep(30);
              return new D();
            }};
    }
};
public abstract Callable<I> worker() throws InterruptedException;

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有不同返回类型的变量可调用对象 的相关文章

随机推荐

  • 如何优化 EF Code First 查询?

    已更新 请参阅底部的更新 我使用 EF 代码优先 并且总体上对此感到满意 然而 一个简单 且常见 的操作导致 EF 生成极其复杂的 SQL 这降低了我的应用程序的速度 我只是使用 整数 ID 列表来获取一组实体 但因为我需要大量子实体的详细
  • 在 C++ 中前向声明静态 C 结构实例

    我正在编写一个代码生成器 实际上是一个数据生成器 它将生成这种形式的数据结构 显然实际的数据结构要复杂得多 typedef struct Foo int a struct Foo foo Foo extern Foo f1 extern F
  • 使用 Pandas Excelwriter 写入 StringIO 对象?

    我可以将 StringIO 对象传递给 pd to csv 就好 io StringIO StringIO pd DataFrame to csv io 但是当我使用excel writer时 我遇到了很多麻烦 io StringIO St
  • jQuery serializeArray() 键值对

    我在序列化表单时遇到了一些麻烦
  • Bootstrap 一次轮播多个框架

    这是我试图用 Bootstrap 3 轮播实现的效果 它不是一次只显示一帧 而是并排显示 N 帧 然后 当您滑动 或自动滑动时 时 它会像以前一样移动幻灯片组 这可以吗与 bootstrap 3 的轮播 我希望我不必去寻找另一个 jQuer
  • 检查 MongoDB 文档中是否存在多个字段

    我正在尝试查询一个数据库集合 该集合保存具有特定字段的文档的流程文档 为简单起见 想象以下通用文档模式 timestamp ISODate result1 pass result2 fail 现在 当一个进程启动时 会插入一个仅包含时间戳的
  • 在继续当前脚本的同时异步运行单独的 PowerShell 脚本

    PowerShell 脚本 1 执行以下操作 Performs FTP ops ending with saving updated remote directory data in a local file 该脚本快速运行 直到必须使用
  • WPF 全局字体大小

    我正在创建一个 WPF 应用程序 我想知道能够更改 ui 中每个元素的字体大小的最佳方法 我是否创建资源字典并设置样式来设置我使用的所有控件的字体大小 最佳实践是什么 我会这样做
  • CSS3 月亮形状

    我正在尝试创建一个像这样的按钮 我不知道如何在按钮顶部创建一个浅月形状 这还很遥远 小提琴演示 https jsfiddle net wgnp9ygh 2 moon width 50px height 50px border radius
  • 软删除 - 使用 IsDeleted 标志还是单独的连接表?

    我们应该使用软删除标志还是单独的连接表 哪个更有效率 数据库是SQL Server 背景资料 不久前 我们有一位数据库顾问进来查看我们的数据库架构 当我们软删除一条记录时 我们将更新相应表上的 IsDeleted 标志 有人建议不要使用标志
  • .NET Core 2.1 Swashbuckle - 按区域对控制器进行分组

    我的情况比较简单 我有一个非常大的 NET Core 2 1 MVC WebApi 分为几个区域 代表我系统的不同模块 我使用 Swagger SwashBuckle 效果非常好 我的路由就像 area controller action
  • 从 Java 运行“who -m”命令会产生空结果

    我正在尝试从 Java 中查找当前登录的用户名 Process p try p Runtime getRuntime exec who m p waitFor BufferedReader reader new BufferedReader
  • Perl 中的命名参数

    我正在尝试在 Perl 中使用命名参数 我一直在使用http perldesignpatterns com NamedArguments http web archive org web 20160920193219 http perlde
  • LazyEvaluation的性能优势到底从何而来?

    在过去的几天里 我研究了惰性评估 主要是在性能方面 想知道LazyEvalutaion 的性能优势由此显现 我阅读各种文章并不清楚 但其中很少包括 惰性求值有什么优点 https stackoverflow com questions 21
  • Scrapy 中的内存泄漏

    我编写了以下代码来抓取电子邮件地址 用于测试目的 import scrapy from scrapy contrib spiders import CrawlSpider Rule from scrapy contrib linkextra
  • 如何在jquery中创建调用事件的快捷键?

    如何创建在 jQuery 中调用事件的快捷键 就像我按Alt A然后调用按钮单击函数 但不是如果Alt V A 我不知道这是否是最好的解决方案 但也许有帮助 警告 这不是经过实战考验的解决方案 var pressedKeys documen
  • 具有可选扩展的通用打字稿

    如何使用扩展进行输入检查 使通用 ApiResBook 类型与可选道具一起使用 Sandbox https www typescriptlang org play index html code PTAEFkEMEsDtQC4E8AOBTA
  • onClick 在 Activity 上调用的片段内

    我现在正在将一些东西封装到一个片段中 并遇到了一个很难用谷歌搜索的问题 我的片段内部有一些带有 onClick 属性的按钮 但它们是在 Activity 上调用的 而不是在 Android 系统的片段上调用的 这使得封装有点笨拙 有没有办法
  • WordPress:获取附加图像的高度和宽度

    在 WordPress 中 我从帖子中抓取附加图像并将它们显示在无序列表中 它效果很好 除了我现在需要获取图像height and width 就像我得到的一样src 这是我的代码 PHP post thumbnail id get pos
  • 具有不同返回类型的变量可调用对象

    我手头的问题是我的方法one two three four 有不同的返回类型说 A B C D我需要生成可变数量的线程 每个方法一个 具体取决于用例 这意味着我想一次调用方法的子集 现在 我使用cachedThreadPool提交这些可调用