In particular, it simply uses java.util.Timer, which is not so intrusive as having a separate background thread.
This implementation is not concurrent - it can be made synchronized, but that works less well under accesses from multiple threads.