Groovy等待/通知

时间:2011-07-20 17:35:02

标签: groovy wait synchronized notify

我有以下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”。相反,它只是停在“hi”并停留在pause()函数上。关于如何继续该计划的任何想法?

2 个答案:

答案 0 :(得分:2)

线程是一个很大的主题,Java中的库可以执行许多常见操作而无需直接使用Thread API。 “火和忘记”的一个简单示例是Timer

但回答你的直接问题;另一个线程需要通知你的线程继续。请参阅wait {)

上的docs
  

导致当前线程等待,直到另一个线程调用   notify()方法或此对象的notifyAll()方法。其他   单词,此方法的行为就像它只是执行调用一样   等待(0)。

一个简单的“修复”只是为等待通话添加一个固定的持续时间,以继续您的探索。我建议书“Java Concurrency in Practice”。

synchronized void pause() {
        //wait 5 seconds before resuming.
        wait(5000)
    }

答案 1 :(得分: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,我会认真考虑使用a framework like Gpars为Groovy带来并发性,并且由真正了解其内容的人编写。我无法想到任何可以使这种任意暂停代码的东西......但也许您可以设计代码以适应其中一种使用模式?