线程池
线程池
一、为什么需要使用线程池?
1、线程的创建和销毁是比较耗时的:所以可以事先创建好多个线程中,放入到线程池中,需要使用时直接从线程池中去取即可;使用完的线程不销毁,重新放回线程池中
2、实现线程的复用:减少内存开销。
二、如何创建线程池?
使用Executors工具类进行创建;常用的有4种线程池:
1、单线程池newSingleThreadExecutor:需要多个任务依次执行,有顺序。

2、线程数量固定的线程池newFixedThreadPool:使用较多,特别适用于任务较少时。

3、创建无限大的线程池CachedThreadPool: 需要尽快执行完所有任务,无需等待。

4、延迟周期性线程池ScheduledThreadPool:延迟执行任务和周期执行任务

三、shutdown()和shutdownNow()的区别
shutdown(): 能够确保所有任务执行完再关闭。如果有任务提交到线程池,无论当前是否有空闲线程,都把该任务执行完再关闭。
shutdownNow(): 如果有任务提交到线程池,如果当前有空闲线程,则执行该任务,否则关闭。
四、execute()和submit()的区别
I.execute()无返回值,submit()有返回值。
II.submit()建议使用Callable接口对象;submit(Callable接口对象)。
III.execute()只能使用execute(Runnable对象);submit()既可以执行Callable对象也可以执行Runnable对象。
五、Runnable和Callable的区别
I.Runnable无返回值且不能抛异常;Callable有返回值且能抛异常
II.Callable对象不能直接被Thread使用,需要先封装为一个Future对象(封装Callable的返回值)
III.Callable实现的是Call方法,Runnable实现的是Run方法
总结:Callable接口,是Runable接口的增强版。同样用Call()方法作为线程的执行体,增强了之前的run()方法。因为call方法可以有返回值,也可以声明抛出异常。
非线程池的Callable:

线程池的Callable:

总结:实际开发种建议使用线程池进行线程开发,开发效率更高。

浙公网安备 33010602011771号