execute(Runnable x) 没有返回值。可以执行任务,但无法判断任务是否成功完成。

submit(Runnable x) 返回一个future。可以用这个future来判断任务是否成功完成。

在Java5之后,任务分两类:一类是实现了Runnable接口的类,一类是实现了Callable接口的类。

两者都可以被ExecutorService执行

Future future = pool.submit(new RunnableTest("Task2"));
        
        try {
            if(future.get()==null){//如果Future's
 get返回null,任务完成
                System.out.println("任务完成");
            }
        } catch (InterruptedException e) {
        } catch (ExecutionException e) {
            //否则我们可以看看任务失败的原因是什么
            System.out.println(e.getCause().getMessage());
        }
Runnable任务没有返回值(见上面代码),Callable中的call()方法类似Runnable的run()方法,就是前者有返回值,后者没有。

同样,将Runnable的对象传递给ExecutorService的submit方法,则该run方法自动在一个线程上执行,并且会返回执行结果Future对象,但是在该Future对象上调用get方法,将返回null。

当将一个Callable的对象传递给ExecutorService的submit方法,则该call方法自动在一个线程上执行,并且会返回执行结果Future对象。

import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class CallableAndFuture {
    
    public static void main(String[] args) {
        
        //1s内得不到结果就抛异常
        ExecutorService threadPool=Executors.newSingleThreadExecutor();
        
        Future<String> future=threadPool.submit(new Callable<String>() {

@Override
            public String call() throws Exception {
                Thread.sleep(2000);//休息2s
                return "hello";
            }
        });
        
        try {
            System.out.println(future.get(1000, TimeUnit.MILLISECONDS));
        } catch (InterruptedException e) {
    
            e.printStackTrace();
        } catch (Exception e) {
        
            e.printStackTrace();
        }
        
        //提交一组任务,take方法返回已完成的任务的一个任务对应的Future对象
        
        ExecutorService threadPool2=Executors.newFixedThreadPool(10);
        CompletionService<Integer> completionService=new ExecutorCompletionService<>(threadPool2);
        for (int i=1;i<=10;i++){
            final  int seq=i;
        completionService.submit(new Callable<Integer>() {

@Override
            public Integer call() throws Exception {
                Thread.sleep(new Random().nextInt(3000));
                return seq;
            }
            
        });
        }
        
         for (int i=1;i<=10;i++){
        try {
            System.out.println(completionService.take().get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        }
    }

}

参考文章:

submit与execute区别

http://blog.csdn.net/ryantotti/article/details/6956175

Callable与Runable接口

http://blog.csdn.net/yuzhiboyi/article/details/7775266

Callable与Runable接口 submit与execute区别的更多相关文章

  1. submit与execute区别

    1.可以接受的任务类型 submit: execute: 可以看出: execute只能接受Runnable类型的任务 submit不管是Runnable还是Callable类型的任务都可以接受,但是 ...

  2. 多线程 submit与execute区别

    (1)可以接受的任务类型 submit: execute: 可以看出: execute只能接受Runnable类型的任务 submit不管是Runnable还是Callable类型的任务都可以接受,但 ...

  3. 线程池(6)-submit与execute区别

    在线程池里提交任务经常见到submit与execute,如何选择,傻傻分不清楚.那么他们俩有什么区别,使用场景是什么?这篇博客将会介绍. 1.方法定义 void execute(Runnable co ...

  4. 多线程ExecutorService中submit和execute区别

    submit和execute都是 ExecutorService 的方法,都是添加线程到线程池中. 区别 三个区别: 1.接收的参数不一样 2.submit有返回值,而execute没有 Method ...

  5. 并发编程之submit和execute区别

    前言 使用线程池难免会用到submit和execute,但是submit是有坑的,此处做个记录 1.submit坑 此处随便写一个方法,进入内部查看execute和submit /** * @Auth ...

  6. 线程池提交任务时submit()和execute()的区别

    因为之前一直是用的execute方法,最近有个情况需要用到submit方法,所以研究了下. 他们的区别: 1.execut()可以添加一个Runable任务,submit()不仅可以添加Runable ...

  7. ExecutorService中submit()和execute()的区别

    在使用java.util.concurrent下关于线程池一些类的时候,相信很多人和我一样,总是分不清submit()和execute()的区别,今天从源码方面分析总结一下. 通常,我们通过Execu ...

  8. 【多线程 5】线程池的类型以及submit()和execute()的区别

    就跟题目说的一样,本篇博客,本宝宝主要介绍两个方面的内容,其一:线程池的类型及其应用场景:其二:submit和execute的区别.那么需要再次重申的是,对于概念性的东西,我一般都是从网上挑选截取,再 ...

  9. Callable接口、Runable接口、Future接口

    1. Callable与Runable区别 Java从发布的第一个版本开始就可以很方便地编写多线程的应用程序,并在设计中引入异步处理.Thread类.Runnable接口和Java内存管理模型使得多线 ...

随机推荐

  1. ionic3 点击input 弹出白色遮罩 遮挡上部内容

    在Manifest中的activity里设置android:windowSoftInputMode为adjustPan,默认为adjustResize,当前窗口的内容将自动移动以便当前焦点从不被键盘覆 ...

  2. 初见TensorFlow :知其所以然

    2.1 TensorFlow的主要依赖包 TensorFlow依赖的两个最主要的工具包——Protocol Buffer和Bazel. 2.1.1 Protocol Buffer Protocol B ...

  3. 怎么编辑PDF,如何给PDF加水印

    在使用PDF文件的时候,往往会用到PDF编辑器来修改,那么,在使用PDF编辑器修改文件的时候,想要在文件中添加水印,这该怎么操作呢,不会的小伙伴可以看看下面的文章了哦,说不定就会了. 1.打开运行PD ...

  4. jdk的卸载及安装+环境变量的配置

    一.卸载:在控制面板中删除.这是最基本的方式.2. 采用360安全卫士的软件卸载工具,记得将有关的注册表信息全部删除.3. 在“运行”中输入Regedit,打开注册表编辑器,找到HKEY_LOCAL_ ...

  5. ajax beforeSend 写的显示隐藏代码不执行

    ajax如果要写像下方格式 $.ajax({ url: ajaxurl, type: 'POST', dataType: 'json', async:true, data: { }, beforeSe ...

  6. 安装Mysql5.6.19

    存在异常: ERROR (HY000): Can't connect to MySQL server on 'localhost' (10061) 原因:Mysql的服务没有启动 windows7启动 ...

  7. 20165206 2017-2018-2 《Java程序设计》第五周学习总结

    20165206 2017-2018-2 <Java程序设计>第五周学习总结 教材学习内容总结 内部类:支持在一个类中定义另一个类的类. 外嵌类:包含内部类的类,称为内部类的外嵌类. 匿名 ...

  8. caffe调loss方法

    正文 what should I do if... ...my loss diverges? (increases by order of magnitude, goes to inf. or NaN ...

  9. Git基础(四) 查看已暂存和未暂存的修改

    比较工作目录中当前文件和暂存区域快照之间的差异(也就是修改之后还没有暂存起来的变化内容) git diff 比较已暂存的将要添加到下次提交里的内容 git diff --cached Git 1.6. ...

  10. idea格式化代码无效Ctrl+Alt+L

    1.Idea格式化代码,无效,我的原因是热键冲突,我按Ctrl+Alt+L的时候,竟然弹出了锁QQ,果断关了QQ的热键,百度有的是网易啥的,具体情况具体分析吧.