Executor源码解读

〇、[源码版本] jdk 1.8

一、不再显式创建线程

Executor接口是执行提交的Runnable任务的对象。这个接口提供了一种方法,将任务提交与每个任务如何运行的机制解耦,包括线程使用、调度等的细节。通常使用Executor而不是显式创建线程。

[举例1]代码示例

为一组任务中的每个调用显式创建线程的方法:

new Thread(new(RunnableTask())).start()

使用Executor方式可以替代显示创建线程的方法:

Executor executor = <em>anExecutor</em>;
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());

二、不严格要求执行是异步的

然而,Executor接口并不严格要求执行是异步的。在最简单的情况下,一个执行器可以立即在调用者的线程中运行提交的任务。

[举例1]代码示例
class DirectExecutor implements Executor {
   public void execute(Runnable r) {
     r.run();
   }
}

三、任务在调用者线程之外的某个线程中执行

更典型的是,任务在调用者线程之外的某个线程中执行。

[举例1]代码示例

下面的执行程序为每个任务生成一个新线程 。

class ThreadPerTaskExecutor implements Executor {
   public void execute(Runnable r) {
     new Thread(r).start();
   }
 }

四、施加了某种限制的复合执行器

许多Executor的实现对象,对任务的调度方式和时间施加了某种限制。

[举例1]代码示例

下面的执行器将任务的提交序列化到第二个执行器,是复合执行器。

 class SerialExecutor implements Executor {
    final Queue<Runnable> tasks = new ArrayDeque<Runnable>();
    final Executor executor;
    Runnable active;
 
    SerialExecutor(Executor executor) {
      this.executor = executor;
    }
 
    public synchronized void execute(final Runnable r) {
      tasks.offer(new Runnable() {
        public void run() {
          try {
            r.run();
          } finally {
            scheduleNext();
          }
        }
      });
      if (active == null) {
        scheduleNext();
      }
    }
 
    protected synchronized void scheduleNext() {
      if ((active = tasks.poll()) != null) {
        executor.execute(active);
      }
    }
  }

五、concurrent包中提供的Executor的实现对象

concurrent包中提供的Executor的实现对象有:

[举例1]ExecutorService,这是一个更广泛的接口。

一个ExecutorService使用可能的几个线程池中的一个线程池,执行每个提交的任务,通常使用 Executors工厂方法进行配置。

[举例2]ThreadPoolExecutor类,提供了一个可扩展的线程池实现。

继承自AbstractExecutorService接口,AbstractExecutorService实现了ExecutorService接口。

线程池解决两个不同的问题:
a.它们通常在执行大量异步任务时提供改进的性能,因为减少了每个任务的调用开销。
b.它们提供了一种限制和管理资源的方法,包括线程,在执行任务集合时的消耗。
同时,每个ThreadPoolExecutor还维护一些基本的统计信息,例如已完成任务的数量。

[举例3]Executors类,为这些类和接口提供了的工厂和实用方法。

在此concurrent包中定义了ExecutorExecutorServiceScheduledExecutorServiceThreadFactoryCallable类。

六、内存一致性影响

内存一致性影响:将Runnable对象提交给Executor之前,线程中的操作,其内存可见性发生在线程的执行开始前,也可能在另一个线程中。

七、Executor接口只提供了execute方法

execute方法
	void execute(Runnable command);

execute方法:在将来的某个时间执行给定的command命令。命令可以在新线程、池线程或调用线程中执行,具体取决于Executor的实现。
a.参数:runnable类型的任务
b.返回:无
c.异常:
throws RejectedExecutionException
如果参数任务command不能被接受执行
throws NullPointerException
如果参数任务commandnull

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值