英文:
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)类。下面针对你提出的两个问题进行解释:
-
为什么在Executor内部定义了
Executor executor
,这是如何工作的?
在这段代码中,Executor executor
是类内部的一个成员变量。它是通过SerialExecutor
类的构造函数进行初始化的。构造函数接受一个参数,即另一个Executor
实例。这个传入的Executor
实例将被保存到executor
成员变量中,以便在需要时进行调用。 -
在
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<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);
}
}
}
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:
- why define
Executor executor
inside Executor, how this works? - in
public synchronized void execute(final Runnable r)
it createnew Runnable(){}
and in these Runnable, it call Runnable r.run()? what is this?
答案1
得分: 1
-
为什么在 Executor 内部定义了 Executor executor,这是如何工作的呢?
SerialExecutor
是一个使用装饰器模式的包装实现。您可以使用Executor
接口的任何实现来实例化它,也可以将它作为参数传递给需要Executor
的地方。例如:
SerialExecutor se = new SerialExecutor(Executors.newFixedThreadPool(10)); Executor anotherExecutor = se;
有关更多信息,请查看
Executors
类的 Java API 文档。 -
在
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论