2013-04-13 3 views
-1

Я хотел бы сделать два класса. Один (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

, но не нашли. Как это сделать простейшим способом.

Будет много движителей и одно окно.

+0

вероятно, вы должны сказать, что вы хотите, чтобы вычислить – RE60K

+0

нет необходимости запускать задачи, используя отдельные темы – Aubin

ответ

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

} 
+0

-1: ждать() в краске(), очень очень очень плохая идея! – Aubin

+0

Без петли, зачем ждать() в конце концов? – Timmy

+0

@Timmy: Потому что paint() вызывается в другом цикле: контур GUI – Aubin

0

Поскольку задачи должны работать попеременно, нет необходимости запускать задачи, используя отдельные потоки, как это трудно получить параллелизм право. Используйте ScheduledExecutorService для периодического запуска логики в одном потоке.

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

+1: 'нет необходимости запускать задачи с использованием отдельных потоков', -1: Нет, у окон есть свой собственный поток. paint() не может вызываться из run() – Aubin

+0

Будет много движителей и одно окно. – Yoda

+0

@RobertKilar Класс класса под вашим контролем? Работает ли он на отдельном потоке, который периодически вызывает repaint()? – Timmy

Смежные вопросы