Callable与Runable接口 submit与execute区别

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

 

 

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1685978

时间: 2024-12-03 19:53:50

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

java自定义任务类定时执行任务示例 callable和future接口使用方法_java

Callable 和 Future接口Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务. Callable和Runnable有几点不同: (1)Callable规定的方法是call(),而Runnable规定的方法是run().(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的. (3)call()方法可抛出异常,而run()方法是不能抛出异常的.(4)运行Callable任务可拿到一

php中抽象类和接口的概念以及区别

本篇文章是对php中抽象类和接口的概念以及区别进行了详细的分析介绍,需要的朋友参考下   复制代码 代码如下: //抽象类的定义: abstract class ku{ //定义一个抽象类 abstract function kx(); ...... } function aa extends ku{ //实现抽象类的方法 function kx(){ echo 'sdsf'; } } //使用方法 $aa=new aa; $aa->kx(); //1.定义一些方法,子类必须完全实现这个抽象中所

Java中接口和抽象类的区别与相同之处

  这篇文章主要介绍了Java中接口和抽象类的区别与相同之处,本文讲解了抽象类的概念.接口的概念.接口和抽象类的区别与联系等内容,需要的朋友可以参考下 1. 抽象类: (1).概念:抽象类是对一种事物的抽象,即对类抽..抽象类是对整个类整体进行抽象,包括属性.行为.Java抽象类和Java接口一样,都用来声明一个新的类型.并且作为一个类型的等级结构的起点. (2).格式: 代码如下: public abstract class abstractDemo{ /**属性*/ private Stri

Java接口和抽象类的区别深入剖析_java

本文剖析了Java学习中接口和抽象类的区别,对于初学者深入学习并准确掌握Java程序设计的理念至关重要.详情如下: Java初学者往往容易提出这样的问题:接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么? 接口和抽象类的概念不一样.接口是对动作的抽象,抽象类是对根源的抽象.抽象类表示的是,这个对象是什么.接口表示的是,这个对象能做什么.比如,男人,女人,这两个类(如果是类的话--),他们的抽象类是人.说明,他们都是人. 人可以吃东西,狗也可以吃东西,你可以把"吃东西"定义成一

C# 接口 与 类的 区别

问题描述 C# 接口 与 类的 区别 C# 接口与类的作用的区别,什么时候该用接口,什么时候改用类.比如,不用知道具体的子类是什么,调用通用的接口,这个用基类实现也行,用接口实现也行.PS:这里不用讨论基本概念,想从最能突出各自作用的一些点做更深刻的说明. 解决方案 C#不允许多继承,比如asp.net的page,winforms里的control form,已经有一个基类了,就不能再继承一个抽象类,只能使用接口. 接口不能包含代码实现.私有字段,它提供了方法的约定,用来规范相同或者相似功能的一

Java中接口和抽象类的区别与相同之处_java

1. 抽象类: (1).概念:抽象类是对一种事物的抽象,即对类抽..抽象类是对整个类整体进行抽象,包括属性.行为.Java抽象类和Java接口一样,都用来声明一个新的类型.并且作为一个类型的等级结构的起点. (2).格式: 复制代码 代码如下:    public abstract class abstractDemo{             /**属性*/             private String name;             /**方法*/             pub

js表单提交和submit提交的区别实例分析_javascript技巧

本文实例分析了js表单提交和submit提交的区别.分享给大家供大家参考,具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <

【转载】接口和抽象类的区别 --相信你看完不会再混淆了

原文地址:http://www.cnblogs.com/huihui-gohay/archive/2009/12/13/1623070.html   我想,对于各位使用面向对象编程语言的程序员来说,"接口"这个名词一定不陌生,但是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?能不能用抽象类代替接口呢?而且,作为程序员,一定经常听到"面向接口编程"这个短语,那么它是什么意思?有什么思想内涵?和面向对象编程是什么关系?本文将一一解答这些疑问.   1.

转:ExtJS中Ext.Ajax.request与form1.getForm().submit的基本区别

问题描述 相同点:都属于Ajax提交方式!不同点:Ext.Ajax.request是Ext.data.connection的一个实例form1.getForm().submit是BasicForm的一个实现方式使用上的区别:1.form1.getForm().submit常用在表单提交的时候,就是说要提交页面数据,比如新增和修改数据页面2.Ext.Ajax.request常用在根据参数提交的时候,比如删除,我们把页面选中的ID进行遍历,封装在一个Array中,作为一个参数做Ajax的提交例子:首