用户工具


任务最终是以Runnable的方式在Thread中运行的,Callable只是为了对异步编程友好

Thread

一个线程,封装了一个Runnable对象。屏蔽了操作系统创建线程的细节

  • 关键方法
    • run()
  • 调用过程
    • Thread.start()方法 → 调用本地方法start0() → 调用Thread.run方法

Runnable

可被线程运行的任务

  • 关键方法
    • run()

Callable

可被运行的任务,并且有返回值

  • 关键方法
    • call()

Future

返回一个异步的token,用于查询任务的执行状态

  • 关键方法
    • isDone()
    • isCancel()
    • get()

FutureTask

一个future任务(对外是一个Runnable任务,但是内部是存的是一个Callable任务),继承了Runnable(具有执行特性),和Future接口(具有异步获取结果的特性)

  • 关键属性
    • Callable 任务 (如果参数是Runable任务,则通过RunnableAdapter适配成Callable任务)
    • state (NEW,COMPLETING,NORMAL,EXCEPTIONAL,CANCELLED,INTERRUPTING,INTERRUPTED)
      • state 状态变化
        • NEW → COMPLETING → NORMAL
        • NEW → COMPLETING → EXCEPTIONAL
        • NEW → CANCELLED
        • NEW → INTERRUPTING → INTERRUPTED
  • 关键方法
    • run() { 调用Callable.call();}
      • 运行时根据运行状态设置state字段
    • get()
      • 一直检测state状态,直到完成
    • get(long timeout, TimeUnit unit)
      • 一直检测state状态,直到完成或超时

RunnableAdapter

把Runnable任务转成,Callable任务 (FutureTask中只保存Callable类型的任务。所以,如果是Runnable任务,需要通过该类转换)

Executor

定义一个任务执行者(这层抽象的目的是将任务的提交和运行方式解耦。你根据需要实现每个线程一个任务,也可以实现复用线程池中的线程)

  • 关键方法
    • execute(Runable runable)
      • 这个执行跟Runnable中的方法不一样
        • Executor.execute()是指用户提交任务啦,我要处理用户提交的任务
        • Runnable.run()指这个任务我要开始在cpu上运行了
        • 一般是在Executor.execute()中调用Runnable.run()方法

ExecutorService

定义执行者的其他管理接口,如何创建任务,如果关闭任务,查看任务状态等。 线程池就是一个执行者的角色,它可以提交任务,并根据自己测策略决定怎么运行任务(重写execute函数)。

  • 关键方法
    • Future<T> submit(Callable<T> task); 底层是FutureTask.run()方法;底层代码是: new Thread(FutureTask).start();
    • Future<T> submit(Runnable<T> task); 底层是FutureTask.run()方法;底层代码是: new Thread(FutureTask).start();
    • invoke();
    • invokeAll()