If you need something that's available right out of the box in JDK 1.5 or later, have you looked at ScheduledExecutorService?
http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html
You can create one of these, backed by a single thread, using this factory method:
http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html#newSingleThreadScheduledExecutor()
There's also an alternative factory method that accepts a ThreadFactory as an argument. This gives you an opportunity to customize the Thread that will run inside the ScheduledExecutorService. For example, you can call Thread.setName to give the thread a more meaningful name. This is very helpful for debugging an application. When you generate a full thread dump, you'll see your custom name attached to the thread instead of a generic name attached automatically by the JVM.
Depending on the need, it might also be appropriate to call Thread.setDaemon(true), so that this thread won't block JVM shutdown.
Also, it's best practice to clean up any ExecutorService after you're done with it by calling ExecutorService.shutdown or ExecutorService.shutdownNow. Without a guaranteed call to shutdown (such as in a finally block), it's possible to introduce a thread leak bug in your application. From the usage you describe, it sounds unlikely that this will bite you, but I always like to stress this when I give someone a recommendation to use an ExecutorService. It's easy to miss this point from the JavaDocs.