That would require reimpl/extend all futures, and as consequence, do reimpl/extend both thread pool executors low level code, instead of doing delegation or reimpl the task decoration methods. The strategy with this lock is simpler than it it looks, considering a cancellation may come concurrently, all other callbacks generators check if the future is cancelled after the unlock, and in such case "try" to do the final callbacks too, which are done only once (the lock is not unlocked).