使用wait / notify创建Event类

时间:2012-08-16 01:56:46

标签: java concurrency

这是一个考试问题,我之前得分很差,但这次试图把它弄好。如果有人能指出我正确的方向,我将不胜感激,谢谢。

我的问题是,提供的解决方案是否以任何方式正确解决问题?怎么可以改进呢。

我的代码遵循这个问题。

问题:

  

事件对象具有信号或非信号的两种状态之一。什么时候   事件处于信号状态,全部或一个等待线程   释放。当它被重置为所有用户的非信号状态时   线程将被迫等待。事件保持在信号状态   直到它重置为非信号状态。基本的想法是   一个或多个线程可以等待某个事件发生。当事件发生   等待发生线程采取任何需要的操作。运用   等待/通知写一个事件类。

我的尝试:

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

2 个答案:

答案 0 :(得分: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();
}
}

答案 1 :(得分:0)

您的代码会正确回答您提出的问题。

可以做一些轻微的优化:

  • 可以同步setSignal()方法,无需额外的同步代码区域。
  • 即使信号状态尚未更改,notifyAll()也会唤醒所有wait()个线程。通过在setSignal()中检查信号是否从锁定/阻塞状态变为解锁状态,可以避免一些开销。如果是,您通知。如果没有,什么也不做。
  • obj是不必要的。