Java线程池原理及设计模式

为什么要用线程池。

降低资源消耗,线程是操作系统十分宝贵的资源,当多个人同时开发一个项目时,在互不知情的情况下,都自己在代码中创建了线程,这样就会导致线程数过多,而且线程的创建和销毁,在操作系统层面,需要由用户态切换到内核态,这是一个费时费力的过程,而使用线程池可以避免频繁的创建线程和销毁线程,线程池中线程可以重复使用。

提高响应速度,当请求到达时,由于线程池中的线程已经创建好了,使用线程池,可以省去线程创建的这段时间。

提高线程的可管理性,线程是稀缺资源,当创建过多的线程时,会造成系统性能的下降,而使用线程池,可以对线程进行统一分配,调优和监控,线程池的使用十分简单,但是会用不代表用得好,在面试中,基本不会问线程池应该怎么用,而是问线程池在使用不当时会造成哪些问题,实际上就是考察线程池的实现原理,因此搞明白线程池的实现原理是很有必要的一件事,不仅仅对面试会有帮助长春Java培训,也会让我们在平时工作中避过好多坑。

实现原理。

在线程池中存在几个概念:核心线程数,最大线程数,任务队列,核心线程数指的是线程池的基本大小,最大线程数指的是同一时刻线程池中线程的数量最大不能超过该值,任务队列是当任务较多时,线程池中线程的数量已经达到了核心线程数,这时候就是用任务队列来存储我们提交的任务,与其他池化技术不同的是,线程池是基于生产者-消费者模式来实现的,任务的提交方是生产者,线程池是消费者,当我们需要执行某个任务时,只需要把任务扔到线程池中即可。

一,生活场景。

1,场景描述。

常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时,视频会从上次切走的时间点继续播放,下面基于备忘录设计模式来描述该场景流程。

2,代码实现。

publicclassC01_InScene{。

publicsta长春Java培训哪家好ticvoidmain(String[]args){。

Recordrecord=newRecord()。

Playerplayer=newPlayer()。

PlayDatapd1=newPlayData(“西游记”,”19:19”)。

PlayDatapd2=newPlayData(“红楼梦”,”29:19”)。

player.setPlayData(pd1)。

player.saveProgress()。

System.out.println(“正在播放:”+。

player.getPlayData().getVideoName()+”:”+。

player.getPlayData().getPlayTime())。

record.put(newProgress(pd1))。

System.out.println(“===切换播放视频===”)。

长春Java培训机构

player.setPlayData(pd2)。

player.saveProgress()。

System.out.println(“正在播放:”+。

player.getPlayData().getVideoName()+”:”+。

player.getPlayData().getPlayTime())。

record.put(newProgress(pd1))。

System.out.println(“===切回上个视频===”)。

player.resumeProgress(record.get(pd1.getVideoName()))。

System.out.println(“正在播放:”+。

player.getPlayData().getVideoName()+”:”+。

player.getPlayData().getPlayTime())。

发表评论

电子邮件地址不会被公开。 必填项已用*标注