Quaqua 5.4.1 2009-07-14

ch.randelshofer.quaqua.util
Class EventLoop

java.lang.Object
  extended by ch.randelshofer.quaqua.util.EventLoop
Direct Known Subclasses:
SequentialDispatcher

public abstract class EventLoop
extends java.lang.Object

An EventLoop can process events on a separate worker thread. It consists of two parts: the event collector and the event processor.

The event collector collects all incoming events and puts them into a queue.
The event processor removes the events from the queue and processes them.

The key feature of the EventLoop is, that clients don't have to wait until an event has been processed. Clients are free to proceed as soon as the collector has put the event into the queue.

Other important features are that events are processed in the same sequence as they have been collected and that only one thread is used to process the events.

Usage

This is an abstract class. It does all the queue handling, but does no processing. To use it, you have to create a subclass which overrides the methods #collectEvent and #processEvent.

Example

An EventLoop, which outputs Strings on a background thread could look like this:


 public class AsyncDisplay
 extends AbstractEventLoop {
     public void display(String string) {
         collectEvent(string);
     }
     protected void processEvent(Object event) {
          System.out.println((String) event);
    }
 }
 

To use the class proceed like this:


 AsyncDisplay a = new AsyncDisplay();
  a.display("Hello World");
 

Version:
1.4 2009-06-01 Added method dispose.
1.3 2006-04-07 Fixed bug in processEvents method. Support for FIFO sequence added. Replaced Vector by LinkedList.
1.2AWT 2001-09-24 Support for coalescing of events added.
1.1 2001-08-24 Reworked for JDK 1.3.
1.0.2 2000-03-03 Catch SecurityException's (To make this class work in Netscape Navigator).
history 1.0.1 14.10.1998 Versionskennung in Klassenkommentar eingef�gt.
history 1.0 Datum ? Threads werden nicht mehr wiederverwendet.
Author:
Werner Randelshofer

Constructor Summary
EventLoop()
          Creates a new EventLoop which processes events at Thread.NORM_PRORITY.
EventLoop(int priority)
          Creates a new EventLoop which processes events at the desired thread priority.
 
Method Summary
 void clear()
          Clears the event queue.
protected  void collectEvent(java.lang.Object event)
          Collects an event and puts it into the event queue for later processing.
 void dispose()
           
 boolean isCoalesce()
          Returns true if the EventLoop coalesces multiple pending events.
 boolean isLIFO()
          Returns true if the EventLoop coalesces multiple pending events.
protected abstract  void processEvent(java.lang.Object event)
          This method processes an event on the event processor thread.
protected  void processEvents()
          This method removes events from the event queue and proceses them until the queue is empty or until #stop is called.
 void setCoalesce(boolean b)
          Sets whether the EventLoop coalesces multiple pending events.
 void setLIFO(boolean b)
          Sets whether the EventLoop shall enqueue events at the beginning of the queue instead of at the end of the queue.
 void start()
          Starts the event processor.
 void stop()
          Stops the event processor.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

EventLoop

public EventLoop()
Creates a new EventLoop which processes events at Thread.NORM_PRORITY.


EventLoop

public EventLoop(int priority)
Creates a new EventLoop which processes events at the desired thread priority.

Parameters:
priority - The Thread priority of the event processor.
Method Detail

collectEvent

protected void collectEvent(java.lang.Object event)
Collects an event and puts it into the event queue for later processing.

Parameters:
event - The event to be put into the queue.

setCoalesce

public void setCoalesce(boolean b)
Sets whether the EventLoop coalesces multiple pending events. A busy application may not be able to keep up with event generation, causing multiple events to be queued. Coalescing is based on equality tests of event objects. More formally, coalesces an event o if and only if the queue contains at least one element e such that (o==null ? e==null : o.equals(e)).

EventLoops do not coalesce events by default.

Parameters:
b - Specify true to turn on coalescing.

isCoalesce

public boolean isCoalesce()
Returns true if the EventLoop coalesces multiple pending events.

See Also:
setCoalesce(boolean)

setLIFO

public void setLIFO(boolean b)
Sets whether the EventLoop shall enqueue events at the beginning of the queue instead of at the end of the queue.

Parameters:
b - Specify true to enqueue events at the beginning of the queue.

isLIFO

public boolean isLIFO()
Returns true if the EventLoop coalesces multiple pending events.

See Also:
setCoalesce(boolean)

start

public void start()
Starts the event processor.
The event processor is started by default.


stop

public void stop()
Stops the event processor.


clear

public void clear()
Clears the event queue.


dispose

public void dispose()

processEvent

protected abstract void processEvent(java.lang.Object event)
This method processes an event on the event processor thread.

Parameters:
event - An event from the queue.

processEvents

protected void processEvents()
This method removes events from the event queue and proceses them until the queue is empty or until #stop is called.

This method must be called from the event processor thread only.


Copyright 2003-2007 (c) Werner Randelshofer.
All rights reserved.