如何实现一个线程池?核心组件有哪些?