Groovy ждать / уведомлять - PullRequest
3 голосов
/ 20 июля 2011

У меня есть следующий код Groovy:

abstract class Actor extends Script {
    synchronized void proceed() {
        this.notify()
    }

    synchronized void pause() {
        wait()
    }
}

class MyActor extends Actor {
    def run() {
        println "hi"
        pause()
        println "hi again"
    }
}

def theactor = new MyActor()
theactor.run()
theactor.proceed()

Когда я запускаю код, я хочу, чтобы код вывел «hi» и «hi again».Вместо этого он просто останавливается на «привет» и застревает в функции pause ().Любая идея о том, как я мог бы продолжить программу?

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Как говорит Брайан, многопоточность и параллелизм - огромная область, и ее легче понять неправильно, чем правильно ...

Чтобы ваш код работал, вам нужно что-то вроде этого:

abstract class Actor implements Runnable {
  synchronized void proceed() { notify() }
  synchronized void pause()   { wait()   }
}

class MyActor extends Actor {
  void run() {
    println "hi"
    pause()
    println "hi again"
  }
}


def theactor = new MyActor()             // Create an instance of MyActor
def actorThread = new Thread( theactor ) // Create a Thread to run this instance in
actorThread.start()                      // Thread.start() will call MyActor.run()
Thread.sleep( 500 )                      // Make the main thread go to sleep for some time so we know the actor class is waiting
theactor.proceed()                       // Then call proceed on the actor
actorThread.join()                       // Wait for the thread containing theactor to terminate

Однако, если вы используете Groovy, я бы серьезно подумал об использовании фреймворка, подобного Gpars , который обеспечивает параллелизм в Groovy и написан людьми, которые действительно знают свое дело. Однако я не могу придумать ничего такого, что может привести к такому произвольному приостановлению кода ... Может быть, вы могли бы разработать свой код так, чтобы он соответствовал одному из их шаблонов использования?

2 голосов
/ 20 июля 2011

Потоки - это большая тема, и в Java есть библиотеки, которые могут выполнять многие обычные задачи, не работая напрямую с Thread API.Один простой пример «Огня и Забвения» - это Таймер .

Но чтобы ответить на ваш ближайший вопрос;другой поток должен уведомить ваш поток, чтобы продолжить.См. docs on wait ()

Заставляет текущий поток ждать, пока другой поток не вызовет метод notify () или метод notifyAll () для этого объекта.Другими словами, этот метод ведет себя точно так же, как если бы он просто выполнял ожидание вызова (0).

Одно простое «исправление» - просто добавить фиксированную продолжительность к вашему ожиданию вызова, чтобы просто продолжитьисследование.Я бы предложил книгу « Параллелизм Java на практике ».

synchronized void pause() {
        //wait 5 seconds before resuming.
        wait(5000)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...