首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用等待/通知创建事件类

使用等待/通知创建事件类
EN

Stack Overflow用户
提问于 2012-08-16 01:56:46
回答 2查看 314关注 0票数 1

这是一个我以前成绩很差的试题,但这次我试着把它做好。如果有人能指出正确的方向,我会很感激的,谢谢。

我的问题是,提供的解决方案在任何方面是否正确解决问题?怎么才能改进呢。

我的代码遵循这个问题。

问题:

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

我的尝试:

代码语言:javascript
复制
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();           
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-16 02:48:42

我做了这个测试课,我认为这是答案,我的事件在某种程度上类似于你的。

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

编辑:,我不知道你的简单问题,所以也许这段代码对你没用。不管怎样,你的活动课应该能工作,所以我能说什么呢?

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-08-16 03:44:06

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

有几个小小的优化可以完成:

  • 可以同步setSignal()方法,从而消除了额外同步代码区域的需要。
  • 即使信号状态没有改变,notifyAll()也会唤醒所有的wait()'ing线程。在setSignal()中,如果信号从锁定/阻塞状态转到未锁定状态,可以通过检查来避免一些开销。如果是,通知。如果没有,什么也不做。
  • obj是不必要的。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11979704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档