1

これは私が以前に悪い点数をとった試験問題ですが、今回は正しい問題を解こうとしています。誰かが私を正しい方向に向けることができれば幸いです、ありがとう。

私の質問は、提供されたソリューションは問題を解決するために何らかの方法で正しいですか? どうすれば改善できるでしょうか。

私のコードは質問に従います。

質問:

イベント オブジェクトには、シグナル状態または非シグナル状態の 2 つの状態のいずれかがあります。イベントがシグナル状態になると、すべてまたは 1 つの待機中のスレッドが解放されます。非シグナル状態にリセットされると、すべてのユーザー スレッドは強制的に待機します。イベントは、非シグナル状態にリセットされるまでシグナル状態のままです。基本的な考え方は、1 つまたは複数のスレッドがイベントの発生を待機できるというものです。待機していたイベントが発生すると、スレッドは必要なアクションを実行します。wait/notify を使用して Event クラスを記述します。

私の試み:

class Event  {
    boolean signal;
    String obj = new String();

    public Event(boolean signal) {
        this.signal = signal;
    }
    synchronized void getSignal(){
        while(!signal)
            try{
                wait();
            }
            catch(InterruptedException e) {}
    }
    public void setSignal(boolean signal) {
        synchronized (this) {
            this.signal = signal;
            this.notifyAll();           
        }
    }
}
4

2 に答える 2

0

あなたのコードはあなたが提起した質問に正しく答えるでしょう。

実行できるわずかな最適化がいくつかあります。

  • setSignal()メソッドを同期できるため、余分に同期されたコード領域が不要になります。
  • 信号の状態が変更されていない場合でも、notifyAll()ウェイクアップはすべてwait()のスレッドをウェイクアップします。setSignal()信号がロック/ブロック状態からロック解除状態に移行するかどうかをチェックインすることで、オーバーヘッドを回避できます。もしそうなら、あなたは通知します。そうでない場合は、何もしません。
  • obj不要です。
于 2012-08-16T03:44:06.547 に答える
0

私は主題に答えると思うこのテストクラスを作成しました。私のイベントはあなたのイベントに似ています。

スレッドはイベントが発生するのを待っており (シグナルが発生した場合)、別のスレッドが時々シグナルをアクティブ化および非アクティブ化する間、リセットを待ちます。

編集:あなたの簡単な質問を知らなかったので、このコードは役に立たないかもしれません。とにかく、あなたの Event クラスは動作するはずです。

public class SynchronizationTest {

public class Event  {

    boolean signal = false;
    synchronized String getEvent(){
        while(!signal) {
            try{
                wait();
            }
            catch(InterruptedException e) {}
        }
        return "This is an event";
    }

    synchronized public void waitNextEvent(){
        while(signal) {
            try{
                wait();
            }
            catch(InterruptedException e) {}
        }
    }

    synchronized public void setSignal(boolean signal) {
        this.signal = signal;
        this.notifyAll();
    }
}

class EventChecker extends Thread {

    private Event event;
    public EventChecker(Event event) {
       this.event=event;
    }

    public void run(){
        while (true) {
            String eventStr = event.getEvent();
            System.out.println("EventChecker: Got event '"+eventStr+"'");
            System.out.println("EventChecker: wait for new event.. \n");
            event.waitNextEvent();
        }
    }
}

class EventSignaler extends Thread {

    private Event event;
    public EventSignaler(Event event) {
       this.event=event;
    }

    public void run(){
        while (true) {
            event.setSignal(true);
            System.out.print("EventSignaler: Sending new signal\n");
            try {
                sleep((int) (Math.random()*2200));
            } catch(Exception e){}

            event.setSignal(false);
            System.out.print("EventSignaler: Deactivating signal\n\n");
            try {
                sleep((int) (Math.random()*4200));
            }
            catch(Exception e){}
       }
    }
}

public void startTest() {

    Event event=new Event();
       EventSignaler eventSignaler = new EventSignaler(event);
       EventChecker eventChecker=new EventChecker(event);
       eventSignaler.start();
       eventChecker.start();
}

public static void main(String arg[]) {

    SynchronizationTest synchro = new SynchronizationTest();
    synchro.startTest();
}
}
于 2012-08-16T02:48:42.810 に答える