2020java线程学习最系统书籍

        第一次接触多线程是在学校的操作系统课程上,那时候学校的教材是郑扣根翻译的那本操作系统概念(第七版),厚厚的一本几百来页,老师上课也只是挑着来讲。后来在上java的课时,再次接触到了多线程这个概念,我想大部分人也都接触过,那个多窗口同时卖车票的经典例子吧,这是我第一次实际动手写的第一个java多线程的demo。随着课程的深入,我了解到的线程创建方式有三种,那个时候也仅仅知道三种线程的创建方式继承Thread类创建线程、实现Runnable接口创建线程和使用Callable和Future创建线程,前两者的实际线程对象都是thread对象,而后者Callable提供了一个call方法作为线程执行体,该方法可以有返回值且能声明抛出的异常,读书时还没有接触到线程池的概念,直到第一次秋招面试的时候,我才知道有线程池这个东西。而线程池的出现最大的优点就在于把任务提交和执行解耦,而我第一次接触的线程池框架就是jdk1.5引入的Executor框架,只需把Task描述清楚,然后提交即可。这个Task是怎么被执行的,被谁执行的,什么时候执行的,提交的人就不用关心了。具体点讲,就是提交一个Callable对象给ExecutorService(如最常用的线程池ThreadPoolExecutor),将得到一个Future对象,调用Future对象的get方法等待执行结果就好了。Executor框架的内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题——如果我们在构造器中启动一个线程,因为另一个任务可能会在构造器结束之前开始执行,此时可能会访问到初始化了一半的对象用Executor在构造器中。 

      后来又陆续接触到了五种线程池newCachedThreadPool、newWorkStealingPool、newSingleThreadExecutor、newFixedThreadPool、newScheduledThreadPool,这些线程池都有各自应用场景, newCachedThreadPool适合服务器负载较低且很多短期异步任务需要执行,newFixedThreadPool适合服务器负载较重,对当前线程数量进行限制newSingleThreadExecutor适合单线程顺序执行各个任务newScheduledThreadPool适合延时,定时启动多个任务,newWorkStealingPool适合多任务队列,需并行操作的任务。

     上个月我正在做的一个关于房产的项目,其中涉及到楼盘筛选,因为楼盘的一些指标需要根据楼盘去统计房间相关数据,而房间数据又过于庞大导致查询性能低下,尝试了多种方式,用mongodb、内存表、es,发现最终只有es可行,但是采用es存储必然意味着架构需要重新调整,而上线在即,并没有这么多时间让我们立即改用es这个方案,我们唯有继续思考,朝数据量大这个点突破,因为房间和楼盘相关,如果我们将楼盘分组,并发执行sql是否就可以撑一版,这么一想我就用ThreadPoolExecutor建了核心和最大线程为30的单个线程池,然后用Future对象将这些分组的楼盘分别提交,最后使用Future的get方法拿到异步返回的所有结果,将数据聚合,再进行相关操作,最终使得该查询功能得到质的提升。虽然,最终该功能没有上线,但是也为类似的一个因性能所困的业务提供了一个解决问题的方案,最终,版本如期上线。

2020java线程学习最系统书籍_第1张图片

你可能感兴趣的:(2020java线程学习最系统书籍)