如何做一个简单的循环线程队列

时间:2013-04-13 07:10:56

标签: java multithreading queue priority-queue

我想做两节课。一个(class Mover)正在更改其他(class Window)用于重新绘制每个1/30 seconds内容的字段。我想让它们互换工作(Mover,Window,Mover,Window,Mover,Window,Mover,Window ......)。 Mover正在等待Window正在计算,Mover正在等待Window正在重新投放。

我正在寻找像

一样工作的线程队列

q.next(); next thread is awakening and the current is going to the end to wait

但没有找到。如何以最简单的方式做到这一点。

会有很多推动者和一个窗口。

2 个答案:

答案 0 :(得分:0)

听起来你正在尝试解决生产者 - 消费者的问题。可能是您可以在某些常见锁上同步Mover / Window,然后使用wait / notify功能。像下面的东西

class Lock {
  public static Lock INSTANCE = new Lock();
}

class Mover {

  public void move() {
    synchronized(Lock.INSTANCE) {
       //do the move
       Lock.INSTANCE.notifyAll();
       Lock.INSTANCE.wait();
    }
  }

}

class Window {

  public void paint() {
    synchronized(Lock.INSTANCE) {
       //do the paint
       Lock.INSTANCE.notifyAll();
       Lock.INSTANCE.wait();
    }
  }

}

答案 1 :(得分:0)

由于任务应该可以互换地运行,因此不需要使用单独的线程来运行任务,因为很难获得正确的并发性。使用ScheduledExecutorService在一个线程中定期运行逻辑。

    ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
    ses.schedule(new Runnable(){
        public void run(){
            mover.run();
            window.run();
        }
    }, 1000/30, TimeUnit.MILLISECONDS);