1

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

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

我的代码遵循这个问题。

问题:

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

我的尝试:

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

我做了这个测试课,我认为它回答了这个问题,我的事件在某种程度上与你的相似。

一个线程正在等待事件发生(发出信号时),然后等待重置,而另一个线程不时地激活和停用信号。

编辑:我不知道你的简单问题,所以也许这段代码对你没用。无论如何,您的 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 回答
0

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

可以做一些轻微的优化:

  • setSignal()方法可以同步,无需额外的同步代码区域。
  • 即使信号状态没有改变,也会唤醒notifyAll()所有线程。如果信号从锁定/阻塞状态变为解锁状态wait(),您可以通过检查来避免一些开销。setSignal()如果是,您通知。如果没有,什么也不做。
  • obj是不必要的。
于 2012-08-16T03:44:06.547 回答