【发布时间】:2015-05-21 12:07:36
【问题描述】:
当自定义EventListener 处理自定义EventObject 时会发生什么?
一旦处理程序完成:
- 执行是否回到标准线程代码?或者,
- 线程是否关闭?
【问题讨论】:
-
什么是“标准螺纹代码”?
标签: java multithreading events
当自定义EventListener 处理自定义EventObject 时会发生什么?
一旦处理程序完成:
【问题讨论】:
标签: java multithreading events
EventListener 只是接口(实际上非常低级),它只定义了应该实现的内容。它是如何实现的,在实现这个接口的类中定义。因此,问题应该是某些特定类如何处理它。它可以在单独的线程中启动,也可以创建新线程或使用当前线程。不同的类处理它的方式不同。我相信他们中的大多数只是在当前自己的线程中调用侦听器的方法。这就是为什么不建议在侦听器本身内部做任何长时间的事情(实际上除了很少的命令来通知事件之外的任何事情)。 这就是灵活性的所在——你决定什么时候做什么。启动新线程并在工作完成或使用现有线程或快速完成工作时完成它,并希望当前线程不会卡住,例如,GUI 窗口不会冻结。
【讨论】:
我创建了一个自定义的 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 中的代码不必等待侦听器代码执行完毕。
【讨论】: