Suppose that we have a Java Task (e.g.: Runnable) that will be executed if we do not receive an external signal in x seconds.
A common way to solve this problem is to use a schedule thread pool (such as ScheduledExecutorService) to execute this task considering x delay. When we receive that external event, from other part of the system, we need to reschedule this task, that is, to reinsert this task in the thread pool with x  delay. 
My question is: what is the correct/optimized way to reschedule a task in a ScheduleExecutorService? Current solutions usually focus on removing/canceling and reinserting the dealyed task in the thread pool. Is this the best approach?