【问题标题】:How to do a simple circular queue of threads如何做一个简单的循环线程队列
【发布时间】:2013-04-13 07:10:55
【问题描述】:

我想做两节课。一个 (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

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

会有很多搬运工和一个窗口。

【问题讨论】:

  • 可能你应该告诉你要计算什么
  • 无需使用单独的线程运行任务

标签: java multithreading queue priority-queue


【解决方案1】:

听起来您正在尝试解决生产者-消费者之类的问题。可能你可以在一些常见的锁上同步移动器/窗口,然后使用等待/通知功能。如下所示

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();
    }
  }

}

【讨论】:

  • 没有循环,为什么还要在最后等待()?
  • @Timmy: 因为paint() 在另一个循环中被调用:GUI 循环
  • @Aubin 线程可以无缘无故地从 Object.wait() 唤醒。 java doc.
【解决方案2】:

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

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

【讨论】:

  • +1:`没有必要使用单独的线程运行任务`,-1:不,窗口有自己的线程。无法从 run() 调用paint()
  • @RobertKilar Window 类在您的控制之下吗?它是否在定期调用 repaint() 的单独线程上运行?
猜你喜欢
  • 1970-01-01
  • 2013-03-22
  • 2012-04-12
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 2015-10-10
  • 2018-04-01
  • 1970-01-01
相关资源
最近更新 更多