• Runnable、Callable和Future三者对比


    Runnable是个借口,使用简单:

      1. 实现该接口并重写run方法

      2. 利用该类的对象创建线程

      3. 线程启动时就会自动调用该对象的run方法
          通常在开发中结合ExecutorService使用,将任务的提交与任务的执行解耦开,同时也能更好地利用Executor提供的各种特性
    Runnable接口:
    public interface Runnable {
        public abstract void run();
    }

    缺点:

      1.Runnable接口不能抛出异常,只能内部消化;

      2.Runnable接口没有返回值

    注意:

      因为Java单继承多实现,所以相对于集成Thread类,实现Runnable接口要更好。

    线程池调用

    ExecutorService executor = Executors.newCachedThreadPool();
                       executor.submit(new Runnable() { 
                            public void run() {
                                   //TODO
                            }
                        });
    executor.shutdown();

    Callable接口

      与Runnable不同的是,Callable是个泛型参数化接口,并能返回线程的执行结果,且能在无法正常计算时抛出异常

    public interface Callable<V> {
        V call() throws Exception;
    }

    1. Callable并不像Runnable那样通过Thread的start方法就能启动实现类的run方法,所以它通常利用ExecutorService的submit方法去启动call方法自执行任务,

    而ExecutorService的submit又返回一个Future类型的结果,因此Callable通常也与Future一起使用

    ExecutorService pool = Executors.newCachedThreadPool();
         Future<String> future = pool.submit(new Callable{
               public void call(){
                       //TODO
               }
        });

    Runnable与Callable不同点:

    1. Runnable不返回任务执行结果,Callable可返回任务执行结果
    2. Callable在任务无法计算结果时抛出异常,而Runnable不能
    3. Runnable任务可直接由Thread的start方法或ExecutorService的submit方法去执行
     
    Future
    Future保存异步计算的结果,可以在我们执行任务时去做其他工作,并提供了以下几个方法
    * cancel(boolean mayInterruptIfRunning):试图取消执行的任务,参数为true时直接中断正在执行的任务,否则直到当前任务执行完成,成功取消后返回true,否则返回false
    * isCancel():判断任务是否在正常执行完前被取消的,如果是则返回true
    * isDone():判断任务是否已完成
    * get():等待计算结果的返回,如果计算被取消了则抛出
    * get(long timeout,TimeUtil unit):设定计算结果的返回时间,如果在规定时间内没有返回计算结果则抛出TimeOutException
    使用Future的好处:
    1. 获取任务的结果,判断任务是否完成,中断任务
    1. Future的get方法很好的替代的了Thread.join或Thread,join(long millis)
    2. Future的get方法可以判断程序代码(任务)的执行是否超时,如:
    try{
          future.get(60,TimeUtil.SECOND);
     }catch(TimeoutException timeout){
          log4j.log("异常,将被取消!!");
          future.cancel();
     }
  • 相关阅读:
    面向对象诠释图
    vs中web网站和web应用程序的区别
    基于Windows Mobile 5.0的GPS应用程序开发
    c#添加水印效果
    基于Silverlight4开发的相关工具
    WCF、Net remoting、Web service概念及区别
    数据库的相关经验总结
    SQLite 3 一些基本的使用
    PPC上网设置明细图文并茂
    正则表达式语法参考
  • 原文地址:https://www.cnblogs.com/guanjunhui/p/10312748.html
Copyright © 2020-2023  润新知