JDK7中Runnable和Callable源码概述

来源:互联网 发布:淘宝有情侣网店吗 编辑:程序博客网 时间:2024/06/05 20:03
Runnable概述:

Runnable是java.lang包下的接口;所有已知子接口:RunnableFuture<V>, RunnableScheduledFuture<V>;所有已知实现类:AsyncBoxView.ChildState, FutureTask, RenderableImageProducer, SwingWorker, Thread, TimerTask。


Runnable接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run的无参数方法。设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。例如,Thread类实现了Runnable。激活的意思是说某个线程已启动并且尚未停止。此外Runnable为非Thread子类的类提供了一种激活方式。通过实例化某个Thread实例并将自身作为运行目标,就可以运行实现Runnable的类而无需创建Thread的子类。大多数情况下,如果只想重写run()方法,而不重写其他Thread方法,那么应使用Runnable接口。这很重要,因为除非打算修改或增强类的基本行为,否则不应为该类创建子类。


Runnable只提供了void run()方法:使用实现接口Runnable的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的run方法。方法run的常规协定是,它可能执行任何所需的动作。

Callable概述:

Callable<V>是java.util.concurrent包下的接口,类型参数:V-call方法的结果类型;所有已知子接口:JavaCompiler.CompilationTask。


Callable<V>返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做call的方法。Callable接口类似于Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是Runnable不会返回结果,并且无法抛出经过检查的异常。Executors类包含一些从其他普通形式转换成Callable类的实用方法。


Callable<V>只提供了V call()throws Exception方法:返回计算的结果,如果无法计算结果,则抛出一个异常。


Callable和Runnable的异同:
1.Callable是需要实现call()方法的接口,Runnable是需要实现run()方法的接口;call()方法可以抛出异常,run()方法的异常无法抛出(需要手动处理)
2.Callable可传入泛型参数,Runnable则不需要;Callable可返回泛型参数结果,Runnable返回void
3.都可以作为任务去执行,Callable通过FutureTask可知道任务的状态和结果,Runnable无法获知任务状态【可获取线程状态】和结果

4.Runnable实例对象需要Thread包装启动,Callable实例对象需要先通过FutureTask包装再交给Thread包装执行


实现可参考:https://github.com/chunericli/wise-utils

原创粉丝点击