Java Runnable Queue

时间:2010-11-03 10:31:12

标签: java multithreading

我需要对以下关键代码进行同行评审。

此类维护一个可运行的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}}

2 个答案:

答案 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是一个只有一个方法的自定义界面。 (注意:这个简单的例子希望队列永远不会是空的)