在看sun的代码时有许多经典实现,非常值得学习,下面是sun事件处理的经典实现,具体看代码:
public class MainLoop {
private static MainLoop loop=null;
private int pollRequests = 0;
private MainLoop(){}
public static MainLoop getInstance(){
if(loop==null){
loop=new MainLoop();
}
return loop;
}
//自己实现
public BaseEvent retrieveEvent() {
return null;
}
//自己实现
private boolean checkEvents() {
return false;
}
public synchronized void startPolling() {
pollRequests++;
PollingThread.pollingThreadResume();
}
public synchronized void stopPolling() {
pollRequests--;
if (pollRequests > 0) {
return;
}
PollingThread.pollingThreadSuspend();
}
public void pollEvents() {
while (checkEvents()) {
BaseEvent event = retrieveEvent();
if (event != null) {
event.dispatch();
}
}
}
}
mainloop为主控制类,想读取事件时,执行startPolling
,会开启一个pollingThread不停地pollEvent。
pollEvent不停地checkEvent,如果check到,就retrieveEvent,并把得到的event dispatch。
dispatch事件会把事件加入一队列等待执行事件的process。不想读事件时,直接stopPolling。需要自己根据情况
实现checkEvent和retrieveEvent,并实现自己的Event继承自BaseEvent。
BaseEvent.java
public abstract class BaseEvent {
public void dispatch() {
Dispatcher.enqueue(this);
}
abstract public void process();
}
PollingThread.java
public class PollingThread extends Thread {
private static PollingThread instance = new PollingThread();
private static boolean suspended = true;
private final int POLL_INTERVAL = 1000;
public PollingThread() {
}
public static void pollingThreadSuspend() {
synchronized (instance) {
suspended = true;
}
}
public static void pollingThreadResume() {
try {
instance.start();
} catch (IllegalThreadStateException e) {
}
synchronized (instance) {
suspended = false;
instance.notify();
}
}
public void run() {
MainLoop loop = MainLoop.getInstance();
while (true) {
try {
synchronized (this) {
if (suspended) {
wait();
}
}
loop.pollEvents();
synchronized (this) {
wait(POLL_INTERVAL);
}
} catch (InterruptedException e) {
break;
}
}
}
}
Dispatcher.java
public class Dispatcher extends Thread {
private static Dispatcher instance = new Dispatcher();
private static Vector<BaseEvent> events = new Vector<BaseEvent>();
public Dispatcher() {
}
public static void enqueue(BaseEvent event) {
try {
instance.start();
} catch (IllegalThreadStateException e) {
}
synchronized (events) {
events.addElement(event);
events.notify();
}
}
public void run() {
while (true) {
BaseEvent event = null;
synchronized (events) {
if (!events.isEmpty()) {
event =events.firstElement();
events.removeElementAt(0);
} else {
try {
events.wait();
} catch (InterruptedException e) {
break;
}
}
}
if (event != null) {
event.process();
}
}
}
}
分享到:
相关推荐
一个台湾网站找到的java事件方面的资料,感觉挺好,与大家分享!
事件驱动模型实例详解(Java篇)
Java 开发中事件驱动模型的实例详解,属于转的
java 内存模型 java 内存模型 java 内存模型 java 内存模型
新安江模型:三层蒸发模型、三水源划分产流
JAVA AWT事件模型教学实例.很好的,大家一起共享吧
Java教程之AWT事件模型
深入理解 java 内存模型是 java 程序员的必修课,看看原汁原味正宗的内存模型吧
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
事件处理模型(一看就懂) 2.鼠标事件处理 鼠标是一种最常见的输入方式。用户可以用鼠标绘制图形,利用鼠标实现特殊的控制,例如游戏操作的控制等功能。Java语言中主要提供了三种不同类型的鼠标事件: 鼠标键事件; ...
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
java内存模型文档
深入Java 内存模型本书介绍了,如何深入学习了解JAVA 内存模型!更好的了解java 虚拟机!
JAVA内存模型与垃圾回收 JAVA内存模型与垃圾回收 JAVA内存模型与垃圾回收
深入理解 Java 内存模型,由程晓明编著,深入理解java内存模型JMM
深度剖析java内存模型深度剖析java内存模型深度剖析java内存模型
java内存模型.pdf
java 事件 实例 java事件 事件学习 简单的java事件模型,有注释 java 事件 实例 java事件 事件学习 简单的java事件模型,有注释 java 事件 实例 java事件 事件学习 简单的java事件模型,有注释
java 锁 内存模型, 对于想了解cpu锁,内存模型的同学是很不错的资料
Java内存模型详解,JVM结构..