在HotSpot VM的线程模型中,Java线程被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程;当Java线程终止时,这个操作系统线程也会被回收。操作系统会调用所有线程并将他们分配给可用的CPU。
可以将此种模式分为两层,在上层,Java多线程程序通常把应用程序分解为若干任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程;在底层,操作系统内核将这些线程映射到硬件处理器上。
两级调度模型的示意图:
image
Executor框架主要由3大部分组成:
框架的类与接口:
image
注意一下: 此图不完整,Executor框架的成员还包括: CompletionService
、ExecutorCompletionService
、ForkJoinTask、ForkJoinPool
;
Runnable接口和Callable接口的实现类,都可以被ThreadPoolExecutor或Scheduled- ThreadPoolExecutor执行。它们之间的区别是Runnable不会返回结果,而Callable可以返回结 果。
除了可以自己创建实现Callable接口的对象外,还可以使用工厂类Executors来把一个 Runnable包装成一个Callable。
//Executors方法
public static Callable<Object> callable(Runnable task);
public static <T> Callable<T> callable(Runnable task, T result);
Executor 接口: 是Executor框架的基础,它将任务的提交与任务的执行分离开来。 ExecutorService 接口: 扩展了Executor接口,提供了管理终止的方法(shutdown( ) ,etc),以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。 AbstractExecutorService 类: 提供 ExecutorService 执行方法的默认实现。 ScheduledExecutorService 接口: 一个特殊的 ExecutorService,提供了 可安排在给定的延迟后运行或定期执行的命令。
ThreadPoolExecutor通常使用工厂类Executors来创建。Executors可以创建3种类型的ThreadPoolExecutor:SingleThreadExecutor、FixedThreadPool和CachedThreadPool。 以下是这三种线程池的应用场景说明:
ScheduledThreadPoolExecutor通常使用工厂类Executors来创建。Executors可以创建2种类 型的ScheduledThreadPoolExecutor,如下。
Future接口和实现Future接口的FutureTask类用来表示异步计算的结果。当我们把Runnable 接口或Callable接口的实现类提交(submit)给ThreadPoolExecutor或 ScheduledThreadPoolExecutor时,ThreadPoolExecutor或ScheduledThreadPoolExecutor会向我们 返回一个FutureTask对象。下面是对应的API。
<T> Future<T> submit(Callable<T> task)
<T> Future<T> submit(Runnable task, T result)
Future<> submit(Runnable task)
有一点需要读者注意,到目前最新的JDK 8为止,Java通过上述API返回的是一个 FutureTask对象。但从API可以看到,Java仅仅保证返回的是一个实现了Future接口的对象。在将 来的JDK实现中,返回的可能不一定是FutureTask
作者:jinggod
出处:http://www.cnblogs.com/jinggod/p/8488648.html