Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java事件处理和代码执行-EventObject_Java_Multithreading_Events - Fatal编程技术网

Java事件处理和代码执行-EventObject

Java事件处理和代码执行-EventObject,java,multithreading,events,Java,Multithreading,Events,当自定义EventListener处理自定义EventObject时会发生什么 处理程序完成后: 执行是否返回到标准线程代码?或者 线是闭合的吗 是唯一的接口(实际上是非常低级的),它只定义应该实现什么。它的实现方式在实现该接口的类中定义。所以,问题应该是某个特定类如何处理它。它可以在单独的线程中启动,也可以创建新线程或使用当前线程。不同的类处理它的方式不同。我相信他们中的大多数只是在当前自己的线程中调用侦听器的方法。这就是为什么不建议在监听器本身内部执行任何长时间的操作(实际上,除了少数通知事

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

处理程序完成后:

  • 执行是否返回到标准线程代码?或者
  • 线是闭合的吗
  • 是唯一的接口(实际上是非常低级的),它只定义应该实现什么。它的实现方式在实现该接口的类中定义。所以,问题应该是某个特定类如何处理它。它可以在单独的线程中启动,也可以创建新线程或使用当前线程。不同的类处理它的方式不同。我相信他们中的大多数只是在当前自己的线程中调用侦听器的方法。这就是为什么不建议在监听器本身内部执行任何长时间的操作(实际上,除了少数通知事件的命令外,什么都可以)。
    这就是灵活性的来源——你决定做什么和什么时候做。启动新线程并在任务完成时完成它,或者使用现有线程或快速完成您的任务,希望当前线程不会卡住,例如,GUI窗口没有冻结

    我创建了一个定制的EventListener接口,而不是使用Java标准的EventListener接口。我这样做是为了定义方法。在本例中,我创建了一个handleEvent方法,该方法接收ResultSetEventObject

    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结果集,并且有一个结果集的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();
            }
        }
    }
    
    package com.ggl.event.listener;
    导入java.sql.ResultSet;
    导入java.util.ArrayList;
    导入java.util.List;
    公共类ResultSetListenerHandler{
    私人名单听众;
    public ResultSetListenerHandler(){
    侦听器=新的ArrayList();
    }
    //添加方法以生成结果集并执行
    //fireEvent方法。
    公共void addListener(EventListener listener){
    添加(侦听器);
    }
    公共void RemovelListener(EventListener侦听器){
    对于(int i=listeners.size()-1;i>=0;i--){
    EventListener实例=listeners.get(i);
    if(instance.equals(侦听器)){
    删除(i);
    }
    }
    }
    公共无效fireEvent(最终结果集结果集){
    for(int i=0;i
    有一个添加侦听器的方法和一个删除侦听器的方法

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

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

    什么是“标准线程代码”?