执行提交的Runnable
任务的对象。
此接口提供了一种将任务提交与每个任务的运行机制分离的方法,包括线程使用,调度等的详细信息。
通常使用Executor
而不是显式创建线程。 例如,不是为每组任务调用
new Thread(new RunnableTask()).start()
而是使用:
Executor executor = anExecutor();
executor.execute(new RunnableTask1());
executor.execute(new RunnableTask2());
但是,Executor
接口并不严格要求执行是异步的。 在最简单的情况下,执行程序可以立即在调用者的线程中运行提交的任务:
class DirectExecutor implements Executor {
public void execute(Runnable r) {
r.run();
}
}
更典型地,任务在除调用者线程之外的某个线程中执行。 下面的执行程序为每个任务生成一个新线程。
class ThreadPerTaskExecutor implements Executor {
public void execute(Runnable r) {
new Thread(r).start();
}
}
许多Executor
实现对如何以及何时安排任务施加了某种限制。 下面的执行程序将任务提交序列化到第二个执行程序,说明了一个复合执行程序。
class SerialExecutor implements Executor {
final Queue<Runnable> tasks = new ArrayDeque<>();
final Executor executor;
Runnable active;
SerialExecutor(Executor executor) {
this.executor = executor;
}
public synchronized void execute(final Runnable r) {
tasks.add(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);
}
}
}
此包中提供的code Executor
实现实现了link ExecutorService
,这是一个更广泛的接口。 link ThreadPoolExecutor
类提供可扩展的线程池实现。 Executors
类为这些Executor提供了方便的工厂方法。
void execute(Runnable command);
在将来的某个时间执行给定的命令。 该命令可以在code Executor
实现的判断下在新线程,池化线程或调用线程中执行。
Runnable
Runnable
接口应该由其实例打算由线程执行的任何类实现。 该类必须定义一个名为run
的无参数的方法。
此接口旨在为希望在活动时执行代码的对象提供通用协议。 例如,Runnable
由类Thread
实现。 活动只是意味着一个线程已经启动但尚未停止。
此外,Runnable
提供了一个类活动而不是继承Thread
的方法。 实现Runnable
的类可以通过实例化Thread
实例并将其自身作为目标传递而无需子类化Thread
。 在大多数情况下,如果您只打算覆盖run()
方法而不是其他Thread
方法,则应使用Runnable
接口。
public abstract void run();
当使用实现接口Runnable
的对象来创建线程时,启动该线程会导致在该单独执行的线程中调用对象的run
方法。
run
方法的一般契约是它可以采取任何行动。