SingleThreadExecutor 就像是线程数量为1的FixedThreadPool (指定数量的线程池). 如果希望在 子线程中连续运行 任何流程(长期存活的任务) ,很有用处.
例如: 监听进入的Socket 连接的任务.
一. 如果向SingleThreadExecutor 提交了多个任务, 那么这些任务将排队, 每个任务都会在下一任务开始前,结束运行. 所有的任务将使用相同的线程.
示例代码:
public class LiftOff implements Runnable {
protected int countDown = 10; // Default
private static int taskCount = 0;
private final int id = taskCount++;
public LiftOff() {}
public LiftOff(int countDown) {
this.countDown = countDown;
}
public String status() {
return "#" + id + "(" +
(countDown > 0 ? countDown : "Liftoff!") + "), ";
}
public void run() {
while(countDown-- > 0) {
System.out.print(status());
Thread.yield();
}
}
}
public class SingleThreadExecutor { //单一线程执行器
public static void main(String[] args) {
ExecutorService exec =
Executors.newSingleThreadExecutor();
for(int i = 0; i < 5; i++)
exec.execute(new LiftOff());
exec.shutdown();
}
}
二.用SingleThreadExecutor 来运行这些线程, 以确保任意时刻在任何线程中都只有唯一的任务在运行.
在这种方式中,不需要在共享资源上处理同步。 有时更好的解决方案是在资源上同步,使用 SingleThreadExecutor 可以省去只是为了维持某些事物的原型而进行的各种协调努力
通过序列化任务, 可以消除对序列化对象的需求.