【问题标题】:Java Event handling and code execution - EventObjectJava 事件处理和代码执行 - EventObject
【发布时间】:2015-05-21 12:07:36
【问题描述】:

当自定义EventListener 处理自定义EventObject 时会发生什么?

一旦处理程序完成:

  1. 执行是否回到标准线程代码?或者,
  2. 线程是否关闭?

【问题讨论】:

  • 什么是“标准螺纹代码”?

标签: java multithreading events


【解决方案1】:

EventListener 只是接口(实际上非​​常低级),它只定义了应该实现的内容。它是如何实现的,在实现这个接口的类中定义。因此,问题应该是某些特定类如何处理它。它可以在单独的线程中启动,也可以创建新线程或使用当前线程。不同的类处理它的方式不同。我相信他们中的大多数只是在当前自己的线程中调用侦听器的方法。这就是为什么不建议在侦听器本身内部做任何长时间的事情(实际上除了很少的命令来通知事件之外的任何事情)。 这就是灵活性的所在——你决定什么时候做什么。启动新线程并在工作完成或使用现有线程或快速完成工作时完成它,并希望当前线程不会卡住,例如,GUI 窗口不会冻结。

【讨论】:

    【解决方案2】:

    我创建了一个自定义的 EventListener 接口,而不是使用 Java 标准的 EventListener 接口。我这样做是为了定义方法。在这种情况下,我创建了一个接收 ResultSetEventObject 的 handleEvent 方法。

    package com.ggl.event.listener;
    
    public interface EventListener {
    
        public void handleEvent(ResultSetEventObject eo);
    
    }
    

    那么现在,让我们看看 ResultSetEventObject 类。

    package com.ggl.event.listener;
    
    import java.sql.ResultSet;
    import java.util.EventObject;
    
    public class ResultSetEventObject extends EventObject {
    
        private static final long serialVersionUID = 6904165475135245131L;
    
        private ResultSet resultSet;
    
        public ResultSetEventObject(Object source) {
            super(source);
        }
    
        public ResultSet getResultSet() {
            return resultSet;
        }
    
        public void setResultSet(ResultSet resultSet) {
            this.resultSet = resultSet;
        }
    
    }
    

    这个类拥有一个 SQL ResultSet,并有一个用于 ResultSet 的 getter 和一个 setter。您可以在 EventObject 中包含任何您想要的变量,以及变量 getter 和 setter。

    最后,让我们在一个实际的类 ResultSetListenerHandler 中使用该接口。

    package com.ggl.event.listener;
    
    import java.sql.ResultSet;
    import java.util.ArrayList;
    import java.util.List;
    
    public class ResultSetListenerHandler {
    
        private List<EventListener> listeners;
    
        public ResultSetListenerHandler() {
            listeners = new ArrayList<EventListener>();
        }
    
        // Add method(s) to generate a ResultSet and perform the
        // fireEvent method.
    
        public void addListener(EventListener listener) {
            listeners.add(listener);
        }
    
        public void removeListener(EventListener listener) {
            for (int i = listeners.size() - 1; i >= 0; i--) {
                EventListener instance = listeners.get(i);
                if (instance.equals(listener)) {
                    listeners.remove(i);
                }
            }
        }
    
        public void fireEvent(final ResultSet resultSet) {
            for (int i = 0; i < listeners.size(); i++) {
                final EventListener instance = listeners.get(i);
                Runnable runnable = new Runnable() {
                    public void run() {
                        ResultSetEventObject eo = new ResultSetEventObject(
                                resultSet);
                        eo.setResultSet(resultSet);
                        instance.handleEvent(eo);
                    }
    
                };
                new Thread(runnable).start();
            }
        }
    }
    

    有添加监听器的方法和移除监听器的方法。

    fireEvent 方法是实际为每个侦听器执行侦听器代码的方法。

    在这种情况下,我为每个侦听器创建了一个单独的线程。这样,fireEvent 方法会很快完成。 ResultSetListenerHandler 中的代码不必等待侦听器代码执行完毕。

    【讨论】:

      猜你喜欢
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多