【问题标题】:Is there any way to have events with a variable in Java? Example inside有没有办法在Java中使用变量来处理事件?里面的例子
【发布时间】:2015-04-22 02:15:27
【问题描述】:

说,我有一个包装队列对象的 SystemQueue 类。我使用 systemQueue.add(whatever) 添加到这个队列中,并且我有一个不同的对象,它是一个检查队列的 Runnable,如果它不为空,则从队列中取出并在其代码中使用“whatever”。除了像

这样在运行中有无限循环之外,还有什么方法可以做到这一点
    run(){
        while(true){
            if(!systemQueue.isEmpty()){
                  todo
             }
       }
   }

并让它永远运行? 我要问的是,如何在 java 中使用基于事件的编码进行编码?

有没有什么办法可以在 SystemQueue 内的队列中添加一个 eventListener,如果队列发生变化,调用 SystemExecutor 并让它运行?

【问题讨论】:

    标签: java multithreading performance queue runnable


    【解决方案1】:

    Queue 本身不提供该选项。不过,您可以实现自己的侦听器/事件对。

    事件:

    public class SystemEvent extends java.util.EventObject{
        public SystemEvent(SystemQueue src){
            super(src);
        }
    
        public SystemQueue getSource(){
             return (SystemQueue) super.getSource();
        }
    }
    

    听众:

    public interface SystemListener extends java.util.EventListener{
        public void eventQueued(SystemEvent e);
    }
    

    在系统队列中:

    ArrayList<SystemListener> listeners = new ArrayList<>();
    
    protected void fireEventQueued(){
        SystemEvent e = new SystemEvent(this);
    
        listeners.forEach(l -> l.eventQueued(e));
    }
    
    public void addSystemListener(SystemListener l){
         listeners.add(l);
    }
    
    public void add(something){
        //add something
        fireEventQueued();
    }
    

    现在您需要做的就是让 SystemExecutor 实现 SystemListener 并将实例添加为侦听器。

    【讨论】:

    • 我认为我解释得不好。它基本上是一个聊天程序。比如说,收到一条消息时,会创建一个 ChatMessage 并将其放入 OutputQueue。现在,有一个 ChatExecutor 不断检查 OutputQueue,当它不为空时,开始通过 ClientManager 获取并发送它们,然后将其发送到所有连接的流。我正在尝试扩展我的 ChatMessage 类,但它告诉我它不能,因为我的构造函数中有一个参数,即 UUID,我需要它是最终的。我的意思是,不一定非要这样,但我喜欢这样......我可以使用构建器模式......
    • 此外,此消息将作为消息进入 InputQueue,然后 InputQueueSorter 接受它,确定它是命令还是聊天消息,并构建 SystemMessage 或 ChatMessage,然后将它们分别放入 SystemQueue 或 OutputQueue。
    • 如果您不需要忙于等待,那么您需要实现 Paul 试图在他的代码中解释的观察者模式。所有的流都是消费者,你的 ChatExecutor 将成为生产者。构建器模式与您的用例不匹配。
    • 据我了解的代码你只是在同一点。你会得到一个单线程和一个无限循环。
    猜你喜欢
    • 2021-12-06
    • 2023-04-04
    • 2011-12-15
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多