Callable 和 Future接口 学习

* Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。

* Callable和Runnable有几点不同:

* (1)Callable规定的方法是call(),而Runnable规定的方法是run().

* (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。

* (3)call()方法可抛出异常,而run()方法是不能抛出异常的。

* (4)运行Callable任务可拿到一个Future对象,

* Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。

* 通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。

例子:

public class TimeOut {
    public static void main(String[] args){
        int timeout = 2; //秒.
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Boolean result = false;
        Future<Boolean> future = executor.submit(new MyJob("请求参数=="));// 将任务提交到线程池中
        try {
            result = future.get(timeout*10000, TimeUnit.MILLISECONDS);// 设定在200毫秒的时间内完成
            System.out.println(result);
        } catch (InterruptedException e) {
            System.out.println("线程中断出错。");
            future.cancel(true);// 中断执行此任务的线程
        } catch (ExecutionException e) {
            System.out.println("线程服务出错。");
            future.cancel(true);// 中断执行此任务的线程
        } catch (TimeoutException e) {// 超时异常
            System.out.println("超时。");
            future.cancel(true);// 中断执行此任务的线程
        }finally{
            System.out.println("线程服务关闭。");
            executor.shutdown();
        }
    }  

    static class MyJob implements Callable<Boolean> {
        private String t;
        public MyJob(String temp){
            this.t= temp;
        }
        public Boolean call() {
            //调整i大小测试超时
            for(int i=0;i<999999999;i++){
                if(i==2){
                    System.out.println(t);
                }
                if (Thread.interrupted()){ //很重要
                    return false;
                }
            }
            System.out.println("继续执行..........");
            return true;
        }
    }
}
 
 public class TimeoutTest1 {

    public static void main(String[] args) {
        final ExecutorService service = Executors.newFixedThreadPool(1);
        TaskThread taskThread = new TaskThread();
        System.out.println("提交任务...begin");
        Future<Object> taskFuture = service.submit(taskThread);
        System.out.println("提交任务...end");
        try {
            Object re = taskFuture.get(6000, TimeUnit.MILLISECONDS);// 超时设置,6s
            System.out.println(re);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            System.out.println("超时 取消任务");
            taskFuture.cancel(true);
            System.out.println("超时 取消任务OK");
        } finally {
            service.shutdown();
        }
    }
}

class TaskThread implements Callable<Object> {
    public Object call() throws Exception {
        String result = "空结果";
        try {
            System.out.println("任务开始....");
            //修改sleep 的值测试超时
            Thread.sleep(500);
            result = "正确结果";
            System.out.println("任务结束....");
        } catch (Exception e) {
            System.out.println("Task is interrupted!");
        }
        return result;
    }
}
时间: 2024-11-03 22:05:06

Callable 和 Future接口 学习的相关文章

Java并发编程-Executor框架之Callable和Future接口

在上一篇文章中我们已经了解了Executor框架进行线程管理,这篇文章将学习Executor框架的另一个特性,我们知道执行Runnable任务是没有返回值得,但Executor可以运行并发任务并获得返回值,Concurrent包提供下面两个接口实现这个功能: Callable接口:这个接口声明call(),类似于Runnable的run(),可以在这个方法里实现任务的具体逻辑操作.Callable是一个泛型接口,必须声明call()的返回类型. Future接口:这个接口声明了一下方法来获取Ca

基于java callable及future接口解决生产者消费者问题

这两天复习java线程时,把java里面的线程基本知识点与jdk1.5以后新添加的一些类的使用都了解了一下,借用生产者消费者的问题来将他们实践一下. 题目:(题目在csdn一大牛的空间找的) 生产者-消费者模式,这个食堂中只有1张桌子,同时最多放10个盘子,现在有4个厨师做菜,每做好一盘就往桌子上放(生产者将产品往仓库中放),而有6个食客不停地吃(消费者消费产品,为了说明问题,他们的食量是无的).一般而言,厨师200-400ms做出一盘菜,而食客要400-600ms吃完一盘.当桌子上放满了10个

Callable与Future的介绍

Callable与 Future 两功能是Java在后续版本中为了适应多并发才加入的,Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其他线程执行的任务. Callable的接口定义如下: public interface Callable<V> { V call() throws Exception; } Callable和Runnable的区别如下: I    Callable定义的方法是call,而Runnable定义的方法是

Callable和Future

Future模式 Future接口是Java线程Future模式的实现, 可以来进行异步计算 Callable负责产生结果, Future负责取结果 可以这样解释: 我有一个任务, 提交给了Future, Future则通知Callable替我完成这个任务, 期间我自己可以去做任何想做的事情. 一段时间之后, 就可以从Future那儿取出结果 Callable和Future接口 Callable接口 Callable接口类似于Runnable,但是Runnable不会返回结果,而Callable

多线程-Thread,Runnable,Callable,Future,RunnableFuture,FutureTask

类图: 先看各自的源码: public interface Runnable { public abstract void run(); } public class Thread implements Runnable { /* What will be run. */ private Runnable target; } Thread与Runnable其实是一个装饰器模式. public interface Callable<V> { V call() throws Exception;

Callable与Future的简单介绍

Callable与Future的介绍 Callable与 Future 两功能是Java在后续版本中为了适应多并法才加入的,Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其他线程执行的任务. Callable的接口定义如下: public interface Callable<V> {        V   call()   throws Exception;  }  Callable和Runnable的区别如下: I    Ca

【Java线程】Callable和Future

Future模式 Future接口是Java线程Future模式的实现,可以来进行异步计算. Future模式可以这样来描述: 我有一个任务,提交给了Future,Future替我完成这个任务.期间我自己可以去做任何想做的事情.一段时间之后,我就便可以从Future那儿取出结果. 就相当于下了一张订货单,一段时间后可以拿着提订单来提货,这期间可以干别的任何事情.其中Future接口就是订货单,真正处理订单的是Executor类,它根据Future接口的要求来生产产品. Callable和Futu

Callable和Future用法示例

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

疯狂Java学习笔记(66)-----------Callable、Future和FutureTask

在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦. 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果. 今天我们就来讨论一下Callable.Future和FutureTask三个类的使用方法.以下是本文的目录