我需要对以下关键代码进行同行评审。
此类维护一个可运行的objets队列,并确保它们按顺序执行,即在前一个完成后启动一个新的,直到队列中没有其他任务为止。
我很确定它确实如此,但我必须绝对确定它的行为是有意的。
非常感谢!
public final class RunnableQueue {
private final ExecutorService m_executorService;
private final Queue<Runnable> m_runnables;
private final Runnable m_loop;
public RunnableQueue(ExecutorService executorService) {
m_executorService = executorService;
m_runnables = new LinkedList<Runnable>();
m_loop = new Runnable() {
public void run() {
Runnable l_runnable = current();
while(l_runnable != null) {
l_runnable.run();
l_runnable = next();
}
}
};
}
private Runnable current() {
synchronized (m_runnables) {
return m_runnables.peek();
}
}
private Runnable next() {
synchronized (m_runnables) {
m_runnables.remove();
return m_runnables.peek();
}
}
public void enqueue(Runnable runnable) {
if(runnable != null) {
synchronized (m_runnables) {
m_runnables.add(runnable);
if(m_runnables.size() == 1) {
m_executorService.execute(m_loop);
}
}
}
}
}
修改
基本上,将有数百个RunnableQueue
使用相同的ThreadPool
进行实例化,并且每个执行的Runnable
可能会在其他Runnable
中添加其他RunnableQueue
。
因此,Runnable
会在RunnableQueue
运行时添加{{1}}
答案 0 :(得分:9)
您是否有任何理由不使用单线程的固定线程池?
ExecutorService service = Executors.newFixedThreadPool(1);
submit
Runnable
service
到{{1}}将完全按照您的要求执行服务操作。
答案 1 :(得分:8)
明显的问题:为什么在不想并行执行这些线程时使用Runnable
s(线程)?
如果想要将队列中的 items 与其他内容并行执行,则可以考虑只使用一个执行所有命令的线程(可运行)按顺序排队:
private Queue<Command> queue = initQueue();
public run() {
while(!stop) {
Command nextCommand = queue.pop();
nextCommand.execute();
}
}
Command
是一个只有一个方法的自定义界面。 (注意:这个简单的例子希望队列永远不会是空的)