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

ExcectorService中提交(可运行)和提交(可调用)之间的区别?

邵弘致
2023-03-14

Bellow是实现Runnable类的代码

public class ExecutorServiceWithRunnable {

    public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(10);
        Future<emp> submit =null;
        emp emp = new emp();
        for(int i=0;i<5;i++) {
             submit = (Future<emp>) pool.submit(new RunnableClass(emp));
             try {
                    System.out.println(submit.get().getId());
                } catch (InterruptedException | ExecutionException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }


    }
}
class RunnableClass implements Runnable{

    emp e=null;
    public RunnableClass(emp emp) {
        // TODO Auto-generated constructor stub
        this.e=emp;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println(Thread.currentThread().getName()+"...."+e.getId());
        e.setId(e.getId()+1);

    }

}
class emp{
    int id;
    String status;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
}

得到的输出是:pool-1-thread-1…..0线程“main”java.lang.NullPointerException中的ExecutorServiceWithRunnableCallable.main(ExecutorSServiceWithRunnable.java:15)

以下是Callable的代码

public class ExecutorServiceWithRunnableCallable2 {

    public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(10);
        Future<emp> submit =null;
        emp emp = new emp();
        for(int i=0;i<5;i++) {
             submit = pool.submit(new CallableClass(emp));
             try {
                System.out.println(submit.get().getId());
            } catch (InterruptedException | ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }


    }
}
class CallableClass implements Callable<emp>{
    emp e=null;
    public CallableClass(emp emp) {
        // TODO Auto-generated constructor stub
        this.e=emp;
    }

    @Override
    public emp call() {
        // TODO Auto-generated method stub
        System.out.println(Thread.currentThread().getName()+"...."+e.getId());
        e.setId(e.getId()+1);
        return e;
    }

}

**获得的输出为:**池-1-线程-1….0 1池-1-线程-2….1 2池-1-线程-3….2 3池-1-线程-4….3 4池-1-线程-5….4 5

所以在两种情况下,请澄清提交方法返回的未来对象。

共有1个答案

呼延永新
2023-03-14

< code>Runnable不返回结果。所以< code>Future::get仍然会阻塞,直到runnable完成,但随后只返回< code>null。

submit = (Future<emp>) pool.submit(new RunnableClass(emp));

此类强制转换将产生警告,因为您实际上并没有得到Future

正如Javadoc所说,你真的得到了一个未来

submit = pool.submit(new CallableClass(emp));

如果你想要一个结果,提交一个可调用的。请注意,没有必要进行类强制转换,它可以从可调用的类型中推断出未来的泛型类型。

 类似资料:
  • 问题内容: SharedPreferences用于在Android中保存应用程序数据。 和两者都用来保存在共享偏好的变化。 如Android库中所述: 与commit()将其首选项同步写到持久性存储中的方式不同,apply()立即将其更改提交到内存中的SharedPreferences,但是启动对磁盘的异步提交,并且不会收到任何故障通知。如果此SharedPreferences上的另一个编辑器在a

  • 我试图从数据库中选择数据,更新每个对象,然后在项目管理器中更新数据库。 我试图在每次更新后刷新DAO,但没有任何改变。 该配置非常基本,有一个读写器,提交间隔为100。 读者正在按预期工作: 作者也很基本: 问题是,前100条记录已经提交,但其余的记录没有提交。Spring批处理表显示,它读取所有记录并多次提交,但当我签入数据库时,它只提交一次。 Spring batch的版本是2.2.6。 使现

  • 我第一次认真使用MVC在umbraco建立了一个解决方案。我已经成功地使用BeginUmbracoForm呈现了一个表单,并提交了数据,效果非常好。 我的问题是,我想实现一个重置按钮,但由于我的数据处于会话中,我必须重置服务器端。 查看: 控制器: 单击后,我会被重定向到/umbraco/Surface/SearchCriteriaSurface/Reset,这是一个找不到的资源。 你知道我在按下

  • 我将可调用任务(使用submit())提交给ExecutionService的实现。有时我似乎遇到了死锁,但无法工作在哪里或为什么会发生,所以我想为任务设置一个超时,我不清楚是如何做到的? 我应该吗 在提交任务时,在ExecutionService上使用invokeAny()而不是submit()并设置超时。我使用submit()一次提交许多任务,我是否也可以这样使用invokeAny(),我很谨

  • Commit(提交)就是把修改保存到仓库里。 用法 git commit 选项 -a(--all),把所有修改与删除自动添加到暂存区然后提交。不包含未跟踪文件。 -m(--message),设置提交信息。 练习 1,打开 resources.md ,添加一行文字: # 相关资源 保存文件,再去修改一下: git commit -am '设置相关资源文档标题' 这次用了 -a 选项,它会自动把

  • 说明 支付宝报关接口 官方文档:https://docs.open.alipay.com/155/104778/ 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayCrossBorder\Customs\Submit\Request 属性 名称 类型 说明 $service string 接口名称 $out_request_no string 商户生成的用于唯一标识一次报关操