天天看点

Java多线程(3):ThreadPool(中)

作者:湘王说

您好,我是湘王,这是我的头条号「湘王说」,欢迎您来,欢迎您再来~

线程池是个神器,用得好会非常地方便。本来觉得线程池的构造器有些复杂,即使讲清楚了对今后的用处可能也不太大,因为有一些Java定义好的线程池可以直接使用。但是(凡事总有个但是),还是觉得讲一讲可能跟有助于理解后面的常用线程池,所以该打脸还是打吧-_-!

因为直接结合代码看会更清楚一些,所以我把代码贴出来:

Java多线程(3):ThreadPool(中)

这样就清晰多了。

其中,最主要是要清楚几种workQueue,也就是BlockingQueue<Runnable>的作用。

SynchronousQueue同步队列,这个队列没有所谓的缓冲,这样做是为了排除阻塞时队列丢消息的可能。如果没有其他微服务并行执行的话,可以放心地用这个队列,不然还是小心一点为妙。它的示例代码:

Java多线程(3):ThreadPool(中)

ArrayBlockingQueue,它的使用范围非常广,一般可以用于轻量级的同步锁,也就是在同一个服务中(也就是非微服务架构),如果要具有分布式锁的功能又不想部署zookeeper这么麻烦的话,ArrayBlockingQueue就是一个非常不错的选择。

Java多线程(3):ThreadPool(中)

再来看看ArrayBlockingQueue的另一个例子,可以加深印象:

ArrayBlockingQueue说白了就是一个往里放,一个往外拿:

Java多线程(3):ThreadPool(中)

1、往里放的,只能最多放指定个数就不能再放了(阻塞,等待,这里是5个);

2、往外拿的,如果没有可以拿的了,就等着(阻塞,等待)。

咱们点菜的时候不就是这样吗?

LinkedBlockingQueue这个就牛逼了,相当于无底洞,有多少处理多少,此时线程池能够创建的最大线程数是corePoolSize,而maximumPoolSize就成了摆设,这等于说是完全取决于系统的性能。

Java多线程(3):ThreadPool(中)

最后一个队列是PriorityBlockingQueue,它是一种有优先级的无界阻塞队列,默认的元素执行顺序是升序,可以通过自定义接口Comparable<T>实现compareTo()方法来指定队列中的元素执行顺序。

Java多线程(3):ThreadPool(中)
Java多线程(3):ThreadPool(中)

如果想在线程池的执行线程中加入一点自己希望的动作,可以通过自定义ThreadFactory实现。

Java多线程(3):ThreadPool(中)
Java多线程(3):ThreadPool(中)

其实主要是把常用那几个workQueue搞搞清楚,因为这几个在今后的工作中可能会用到,尤其是ArrayBlockingQueue,它和后面会说的另两个神器,可以说是是「线程三宝」。

感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

继续阅读