Class Sweeper

All Implemented Interfaces:
Runnable, LifeCycle

public class Sweeper extends AbstractLifeCycle implements Runnable

A utility class to perform periodic sweeping of resources.

Sweeper.Sweepable resources may be added to or removed from a Sweeper and the resource implementation decides whether it should be swept or not.

If a Sweeper.Sweepable resources is itself a container of other sweepable resources, it will forward the sweep operation to children resources, and so on recursively.

Typical usage is to add Sweeper as a bean to an existing container:

 Server server = new Server();
 server.addBean(new Sweeper(), true);
 server.start();
 
Code that knows it has sweepable resources can then lookup the Sweeper and offer the sweepable resources to it:
 class MyComponent implements Sweeper.Sweepable
 {
     private final long creation;
     private volatile destroyed;

     MyComponent(Server server)
     {
         this.creation = System.nanoTime();
         Sweeper sweeper = server.getBean(Sweeper.class);
         sweeper.offer(this);
     }

     void destroy()
     {
         destroyed = true;
     }

     @Override
     public boolean sweep()
     {
         return destroyed;
     }
 }