creating subclasses to determine how the action is actually executed, whether on a new thread or a thread pool