如何理解 Java API 文档中 Executor 接口示例。

huangapple go评论89阅读模式
英文:

how to understand this interface Executor example in Java API docs

问题

 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);
     }
   }
 }

这段代码是一个用于实现串行执行的执行器(Executor)类。下面针对你提出的两个问题进行解释:

  1. 为什么在Executor内部定义了Executor executor,这是如何工作的?
    在这段代码中,Executor executor 是类内部的一个成员变量。它是通过SerialExecutor类的构造函数进行初始化的。构造函数接受一个参数,即另一个Executor实例。这个传入的Executor实例将被保存到executor成员变量中,以便在需要时进行调用。

  2. public synchronized void execute(final Runnable r) 方法中,它创建了一个new Runnable(){},并在这个匿名的Runnable内部调用了Runnable r.run()。这是什么意思?
    这段代码实现了一种将任务串行执行的机制。当调用execute方法时,它接受一个Runnable实例作为参数,表示一个待执行的任务。然后,它将这个任务封装在一个新的匿名内部类的Runnable实例中,这个内部类的run方法会在任务执行完成后调用。通过这种方式,它实现了在任务执行结束后,调度下一个任务的逻辑。具体来说:

    • execute方法中,先将传入的任务 r 封装在一个新的匿名Runnable实例中。
    • 这个匿名Runnable实例的run方法首先调用了 r.run(),即执行传入的任务。
    • 然后,无论任务是否正常完成,都会调用 finally 代码块中的 scheduleNext() 方法。
    • scheduleNext() 方法从任务队列中取出下一个待执行的任务,并将其交给保存的 executor 实例执行。

总之,这段代码实现了一个串行执行器,可以按照任务的提交顺序依次执行各个任务,并确保在任务执行完成后再执行下一个任务。这在某些并发编程的场景下很有用。

英文:

Can anyone help to explain this piece of code in details?

 class SerialExecutor implements Executor {
   final Queue&lt;Runnable&gt; tasks = new ArrayDeque&lt;Runnable&gt;();
   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);
     }
   }
 }

I am learning java concurrent programming. When i was looking into the piece of code, I feel lost. There are mainly two points confused me:

  1. why define Executor executor inside Executor, how this works?
  2. in public synchronized void execute(final Runnable r) it create new Runnable(){} and in these Runnable, it call Runnable r.run()? what is this?

答案1

得分: 1

  1. 为什么在 Executor 内部定义了 Executor executor,这是如何工作的呢?

    SerialExecutor 是一个使用装饰器模式的包装实现。您可以使用 Executor 接口的任何实现来实例化它,也可以将它作为参数传递给需要 Executor 的地方。

    例如:

    SerialExecutor se = new SerialExecutor(Executors.newFixedThreadPool(10));
    Executor anotherExecutor = se;
    

    有关更多信息,请查看 Executors 类的 Java API 文档。

  2. public synchronized void execute(final Runnable r) 方法中,它创建了一个新的 Runnable(){},并在这些 Runnable 中调用了 r.run(),这是什么意思?

    在上述方法内部,r.run() 在一个新的 Runnable 实例中被调用,因为在最后调用 r.run() 的 finally 块中,需要调用 scheduleNext() 方法。

英文:

> 1. why define Executor executor inside Executor, how this works?

The SerialExecutor is a wrapper implementation which uses the decorator pattern. You can instantiate it with any implementation of the Executor interface or you can pass it as an argument where an Executor is expected.

Ex:-

SerialExecutor se = new SerialExecutor(Executors.newFixedThreadPool(10));
Executor anotherExecutor = se;

See the Executors class Java API Documentation for more information

> 2. In public synchronized void execute(final Runnable r) it create new Runnable(){} and in these Runnable, it call Runnable r.run()? what is this?

Inside the above method the r.run() is invoked in a new Runnable instance because at the end of calling r.run() in finally block the scheduleNext() method is required to be called.

huangapple
  • 本文由 发表于 2020年10月6日 09:48:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/64218287.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定