Runs this task. If cancel() was called prior to this invocation, has no side effects. Otherwise, behaves with the
following post-conditions: (1) threadToInterrupt's interrupt flag is set to true (unless a concurrent process
clears it); (2) hasExecuted() will return true.
Note that run(), cancel(), and hasExecuted() behave atomically - calls to these methods operate with strict
happens-before relationships to one another.
Returns whether this task has finished executing its timeout behavior. The interrupt flag set by this task will
only be set if hasExecuted() returns true, and is guaranteed not to be set at the time hasExecuted() returns