2012-08-16 78 views
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();   
     } 
    } 
} 
+0

什麼問題? – 2012-08-16 03:09:23

+0

代碼是否正確,如果不正確,是否可以改進? – conor 2012-08-16 03:27:51

+0

它做它應該做什麼? – 2012-08-16 03:37:56

回答

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(); 
} 
} 
0

您的代碼將正確回答您提出的問題。

還有可以做一些細微的優化:

  • setSignal()方法可以同步,消除了對額外的同步代碼區域的需要。
  • 即使信號狀態沒有改變,notifyAll()也會喚醒所有wait()線程。您可以通過檢查setSignal()中的信號是否從鎖定/鎖定狀態進入解鎖狀態來避免一些開銷。如果是這樣,你通知。如果沒有,什麼都不要做。
  • obj是不必要的。