You could store the events for ease of accessing them, aswell as then calling the run method rather than creating a new instance of the class everytime.
Also, for duration/timeUnit, you should rather just keep the time as milliseconds or whatsoever and then when you need to receive the time as some sort of TimeUnit just convert it using its inbuilt methods such as:
Code:
public TimeUnit getAsMinutes() {
return TimeUnit.MILLISECONDS.toMinutes(duration);
}
Nonetheless, different versions of this has been released already, but thanks
(CycleEventHandler/TaskSchedculer, etc, many of these)