Заводной ждать / уведомлять
У меня есть следующий Заводной код:
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()
Когда я запускаю код, я хочу, чтобы код выводил "привет" и "привет еще раз". Вместо этого он просто останавливается на "привет" и застревает на функции pause (). Есть идеи, как мне продолжить программу?
2 ответа:
, Как говорит Брайан, многопоточность и параллелизм-это огромная территория, и это легче получить это неправильно, чем это, чтобы получить это право...
Чтобы ваш код работал, вам нужно иметь что-то вроде этого:
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 и написан людьми, которые действительно знают свое дело. Я не могу придумать ничего, что могло бы вызвать такую произвольную паузу кода. однако... Может быть, вы могли бы разработать свой код, чтобы соответствовать одному из их шаблонов использования вместо этого?
Threading-это большая тема, и в Java есть библиотеки, которые делают много общих вещей, не работая непосредственно с API потока. Один простой пример для "огня и забвения" - таймер .
Но чтобы ответить на ваш непосредственный вопрос, другой поток должен уведомить ваш поток, чтобы продолжить. Смотрите docs on wait ()Заставляет текущий поток ждать, пока другой поток не вызовет метод notify () или метод notifyAll () для этого объекта. В других слова, этот метод ведет себя точно так же, как если бы он просто выполнял вызов подождите(0).
Одно простое "исправление" состоит в том, чтобы просто добавить фиксированную продолжительность к вашему вызову ожидания, чтобы продолжить исследование. Я бы предложил книгу " параллелизм Java на практике ".
synchronized void pause() { //wait 5 seconds before resuming. wait(5000) }