use Runnable instead of Timer to release client resources