Using thread pools for asynchronous processing