您好,我是湘王,这是我的头条号「湘王说」,欢迎您来,欢迎您再来~
线程池是个神器,用得好会非常地方便。本来觉得线程池的构造器有些复杂,即使讲清楚了对今后的用处可能也不太大,因为有一些Java定义好的线程池可以直接使用。但是(凡事总有个但是),还是觉得讲一讲可能跟有助于理解后面的常用线程池,所以该打脸还是打吧-_-!
因为直接结合代码看会更清楚一些,所以我把代码贴出来:
这样就清晰多了。
其中,最主要是要清楚几种workQueue,也就是BlockingQueue<Runnable>的作用。
SynchronousQueue同步队列,这个队列没有所谓的缓冲,这样做是为了排除阻塞时队列丢消息的可能。如果没有其他微服务并行执行的话,可以放心地用这个队列,不然还是小心一点为妙。它的示例代码:
ArrayBlockingQueue,它的使用范围非常广,一般可以用于轻量级的同步锁,也就是在同一个服务中(也就是非微服务架构),如果要具有分布式锁的功能又不想部署zookeeper这么麻烦的话,ArrayBlockingQueue就是一个非常不错的选择。
再来看看ArrayBlockingQueue的另一个例子,可以加深印象:
ArrayBlockingQueue说白了就是一个往里放,一个往外拿:
1、往里放的,只能最多放指定个数就不能再放了(阻塞,等待,这里是5个);
2、往外拿的,如果没有可以拿的了,就等着(阻塞,等待)。
咱们点菜的时候不就是这样吗?
LinkedBlockingQueue这个就牛逼了,相当于无底洞,有多少处理多少,此时线程池能够创建的最大线程数是corePoolSize,而maximumPoolSize就成了摆设,这等于说是完全取决于系统的性能。
最后一个队列是PriorityBlockingQueue,它是一种有优先级的无界阻塞队列,默认的元素执行顺序是升序,可以通过自定义接口Comparable<T>实现compareTo()方法来指定队列中的元素执行顺序。
如果想在线程池的执行线程中加入一点自己希望的动作,可以通过自定义ThreadFactory实现。
其实主要是把常用那几个workQueue搞搞清楚,因为这几个在今后的工作中可能会用到,尤其是ArrayBlockingQueue,它和后面会说的另两个神器,可以说是是「线程三宝」。
感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~