实际项目中(需要非常多的线程),创建跟销毁线程的开销较大,又会用到较多的线程,不妨在创建不用之后,将其存储起来,待使用时再调用
这就引入了线程池的概念
ExecutorService es = Executors.newFixedThreadPool();//创建新的线程池对象,参数是int(表示创建的同时新建多少个线程)并用Executors的子类接收 es.submit(r);//参数为Runnable实现类
由于Runnable接口中的run()方法不能抛异常也没有返回值,所以引入了Callable<T>接口(用法跟Runnable一样)
T call(){}//可抛异常也有返回值,若要传入参数,则可以将参数传入Callable的实现类的构造方法中 用法跟run()一样