1.Runnable接口
实现Runnable接口的类必须使用Thread类的实例才能创建线程(事实上,Thread类也实现了Runnable接口),它允许你定义一个可以由线程完成的任务。如大多数人所已知的那样,它只提供了一个run方法,该方法既不接受任何参数,也不返回任何值。如果你需要从一个未完成的任务中返回一个值,你就必须在该接口之外使用一个方法去等待该任务完成时通报的某种消息。例如:
Runnable runnable = ...;
Thread t = new Thread(runnable);
t.start();
t.join();
String value = someMethodtoGetSavedValue()
从严格上来说,其实上述代码是没有问题的,但是自从JAVA5.0以后,引入了Callable接口。
2.Cabllable接口
Callable接口其实与Runnable接口类似,只不过Runnable接口是实现run方法,而Callable接口实现call方法。参照Callable的API,该方法可以返回一个Object对象,或可返回任何一个在泛型化格式中定义了的特定类型的对象。因为你不可能把Callable对象传到Thread对象去执行,你可换用ExecutorService对象去执行Callable对象。该服务接受Callable对象,并经由submit方法去执行它。 提交一个Callable对象给ExecutorService会返回一个Future对象。然后,Future的get方法将会阻塞,直到任务完成。call方法的唯一要求是这个值要在call方法的结尾处返回。当Future的get方法稍后被调用时,如果任务运行得很快的话,Future将会自动得到这个值,否则将一直等到该值生成完毕为止。更多信息:
3.Future接口
首先了解Future模式:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时 间之后,我就便可以从Future那儿取出结果。就相当于下了一张订货单,一段时间后可以拿着提订单来提货,这期间可以干别的任何事情。其中Future接口就是订货单,真正处理订单的是Executor类,它根据Future接口的要求来生产产品。那么,Future接口是Java线程Future模式的实 现,可以来进行异步计算。
4.Executor接口
Executor接口执行已提交的 Runnables任务的对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。通常使用 Executor 而不是显式地创建线程。并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor执行,Executor.execute(Runnalbe)。Executor在执行时使用内部的线程池完成操作。