Using thread pools for CPU-bound operations