3

我有以下 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() 函数上。关于如何继续该计划的任何想法?

4

2 回答 2

2

线程是一个很大的话题,Java 中有一些库可以在不直接使用 Thread API 的情况下完成许多常见的事情。'Fire and Forget' 的一个简单示例是Timer

但是要回答您的直接问题;另一个线程需要通知您的线程才能继续。请参阅wait() 上的文档

使当前线程等待,直到另一个线程为此对象调用 notify() 方法或 notifyAll() 方法。换句话说,此方法的行为与它只是执行调用 wait(0) 完全相同。

一个简单的“修复”是在您的等待呼叫中添加一个固定的持续时间,以便继续您的探索。我会推荐这本书' Java Concurrency in Practice '。

synchronized void pause() {
        //wait 5 seconds before resuming.
        wait(5000)
    }
于 2011-07-20T19:52:45.273 回答
2

正如 Brian 所说,多线程和并发是一个巨大的领域,出错比正确更容易......

为了让你的代码正常工作,你需要有这样的东西:

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 带来了并发性,并且是由真正了解他们的东西的人编写的。然而,我想不出任何允许这种任意暂停代码的东西......也许你可以设计你的代码来适应他们的一种使用模式?

于 2011-07-20T22:06:08.867 回答