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中的代码不必等待侦听器代码完成执行。什么是“标准线程代码”?