线程池

线程池

一、为什么需要使用线程池?

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:

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

 

posted @ 2022-01-02 22:28  java菜鸟周小天  阅读(71)  评论(0)    收藏  举报