Thread which executes code after Thread.sleep() and can be cancelled only if it's sleeping
I haven't analysed your code in detail, but it looks threadsafe on a quick scan.
I'd just suggest that you avoid reinventing the wheel. The java.util.Timer class will, I think, fit your use-case and is clearer that you are cancelling rather than interrupting your scheduled task. I think we can be fairly confident that it has been well-enough designed, implemented and reviewed to be threadsafe ...