我有以下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()函数上。关于如何继续该计划的任何想法?
答案 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带来并发性,并且由真正了解其内容的人编写。我无法想到任何可以使这种任意暂停代码的东西......但也许您可以设计代码以适应其中一种使用模式?