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」と「hiagain」を出力させたいです。代わりに、「hi」で停止し、pause()関数でスタックします。プログラムを継続する方法について何かアイデアはありますか?

4

2 に答える 2

2

スレッド化は大きなトピックであり、Javaには、スレッドAPIを直接操作せずに多くの一般的なことを実行するためのライブラリがあります。「ファイアアンドフォーゲット」の簡単な例の1つは、タイマーです。

しかし、あなたの当面の質問に答えるために; 続行するには、別のスレッドがスレッドに通知する必要があります。wait()のドキュメントを参照してください

別のスレッドがこのオブジェクトのnotify()メソッドまたはnotifyAll()メソッドを呼び出すまで、現在のスレッドを待機させます。つまり、このメソッドは、単にwait(0)の呼び出しを実行する場合とまったく同じように動作します。

簡単な「修正」の1つは、探索を続行するためだけに、待機呼び出しに固定期間を追加することです。「 JavaConcurrencyinPractice」という本をお勧めします。

synchronized void pause() {
        //wait 5 seconds before resuming.
        wait(5000)
    }
于 2011-07-20T19:52:45.273 に答える
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を使用している場合は、Groovyに並行性をもたらし、自分のことを本当に知っている人々によって作成されたGparsのようなフレームワークの使用を真剣に検討します。ただし、このような任意のコードの一時停止を可能にするものは考えられません...代わりに、使用パターンの1つに合うようにコードを設計できますか?

于 2011-07-20T22:06:08.867 に答える