今天我们要带大家探究Java线程池的运行机制但在这之前需要先复习一下线程。Thread的设计理念假设现在是1990年代而你是Sun公司的核心开发是Java这门语言的设计者之一。在这次发版时你们希望Java能够支持多线程比如同时执行A、B两个任务。作为抽象大师你很自然地想到要设计一个Thread类。new Thread().start()启动一个子线程执行任务B任务A和任务B同时执行但这样一来Thread中的任务就硬编码了new Thread().start()执行的永远是任务B。好在Java支持继承子类继承Thread后可以重写run方法。这样一来new Thread2().start()执行的就是任务C但还是不够灵活。假设我希望任务C在被Thread2执行的同时还能提交给一个线程池执行目前这种基于继承的设计就有点无能为力任务C和Thread是一个整体要想提交任务C只能提交整个Thread对象但线程池不支持提交Thread对象更好的做法是把任务和线程拆分开让任务和线程彼此都更纯粹。由于Java并不像JavaScript那样直接支持Function类型所以要想把任务从Thread拆出来只能设计一个interface或者class承接。经过权衡我们最终选择interface设计了Runnable接口。run方法负责承接任务以任务C为例如果要把任务C从Thread2中拆出来可以这么做任务C被拆出来以后Thread的职责变得单一了回归到最初的设计。好现在我们有了1个Thread线程和1个Runnable任务目前它俩毫无关系。如何让Thread执行Runnable呢换句话说如何Thread和Runnable产生关联呢组合Thread内部维护一个Runnable需要被执行的任务Thread和Runnable是一种松耦合关系非常灵活