关于线程和线程池的学习,我们可以从以下几个方面入手:
第一,什么是线程,线程和进程的区别是什么
第二,线程中的基本概念,线程的生命周期
第三,单线程和多线程
第四,线程池的原理解析
第五,常见的几种线程池的特点以及各自的应用场景
线程池是建立好了线程,外部不需要建立线程,有任务直接放入现有空闲线程
类似长链接,连接不释放,有通讯直接用建立好的连接管道
dubbo tcp长链接---适用于高并发小数据 序列化方式是Hessian+nio
tcp短链接---适用于大数据,并发低
springcloud http报文长,占带宽 传输的大小和序列化方式都效率低于rpt ---导致大量并发性能差
一、
线程,程序执行流的最小执行单位,是行程中的实际运作单位,经常容易和进程这个概念混淆。那么,线程和进程究竟有什么区别呢?首先,进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程,而线程,是运行中的实际的任务执行者。可以说,进程中包含了多个可以同时运行的线程。
二、
线程的生命周期,线程的生命周期可以利用以下的图解来更好的理解:
第一步,是用new Thread()的方法新建一个线程,在线程创建完成之后,线程就进入了就绪(Runnable)状态,此时创建出来的线程进入抢占CPU资源的状态,当线程抢到了CPU的执行权之后,线程就进入了运行状态(Running),当该线程的任务执行完成之后或者是非常态的调用的stop()方法之后,线程就进入了死亡状态。而我们在图解中可以看出,线程还具有一个则色的过程,这是怎么回事呢?当面对以下几种情况的时候,容易造成线程阻塞,第一种,当线程主动调用了sleep()方法时,线程会进入则阻塞状态,除此之外,当线程中主动调用了阻塞时的IO方法时,这个方法有一个返回参数,当参数返回之前,线程也会进入阻塞状态,还有一种情况,当线程进入正在等待某个通知时,会进入阻塞状态。那么,为什么会有阻塞状态出现呢?我们都知道,CPU的资源是十分宝贵的,所以,当线程正在进行某种不确定时长的任务时,Java就会收回CPU的执行权,从而合理应用CPU的资源。我们根据图可以看出,线程在阻塞过程结束之后,会重新进入就绪状态,重新抢夺CPU资源。这时候,我们可能会产生一个疑问,如何跳出阻塞过程呢?又以上几种可能造成线程阻塞的情况来看,都是存在一个时间限制的,当sleep()方法的睡眠时长过去后,线程就自动跳出了阻塞状态,第二种则是在返回了一个参数之后,在获取到了等待的通知时,就自动跳出了线程的阻塞过程
三、
什么是单线程和多线程?
单线程,顾名思义即是只有一条线程在执行任务,这种情况在我们日常的工作学习中很少遇到,所以我们只是简单做一下了解
多线程,创建多条线程同时执行任务,这种方式在我们的日常生活中比较常见。但是,在多线程的使用过程中,还有许多需要我们了解的概念。比如,在理解上并行和并发的区别,以及在实际应用的过程中多线程的安全问题,对此,我们需要进行详细的了解。
并行和并发:在我们看来,都是可以同时执行多种任务,那么,到底他们二者有什么区别呢?
并发,从宏观方面来说,并发就是同时进行多种时间,实际上,这几种时间,并不是同时进行的,而是交替进行的,而由于CPU的运算速度非常的快,会造成我们的一种错觉,就是在同一时间内进行了多种事情
而并行,则是真正意义上的同时进行多种事情。这种只可以在多核CPU的基础下完成。
还有就是多线程的安全问题?为什么会造成多线程的安全问题呢?我们可以想象一下,如果多个线程同时执行一个任务,name意味着他们共享同一种资源,由于线程CPU的资源不一定可以被谁抢占到,这是,第一条线程先抢占到CPU资源,他刚刚进行了第一次操作,而此时第二条线程抢占到了CPU的资源,name,共享资源还来不及发生变化,就同时有两条数据使用了同一条资源,具体请参考多线程买票问题。这个问题我们应该如何解决那?
有造成问题的原因我们可以看出,这个问题主要的矛盾在于,CPU的使用权抢占和资源的共享发生了冲突,解决时,我们只需要让一条线程战歌了CPU的资源时,阻止第二条线程同时抢占CPU的执行权,在代码中,我们只需要在方法中使用同步代码块即可。在这里,同步代码块不多进行赘述,可以自行了解。
四,线程池
又以上介绍我们可以看出,在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。而在Java中,内存资源是及其宝贵的,所以,我们就提出了线程池的概念。
线程池:Java中开辟出了一种管理线程的概念,这个概念叫做线程池,从概念以及应用场景中,我们可以看出,线程池的好处,就是可以方便的管理线程,也可以减少内存的消耗。
那么,我们应该如何创建一个线程池那?Java中已经提供了创建线程池的一个类:Executor
而我们创建时,一般使用它的子类:ThreadPoolExecutor.
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
这是其中最重要的一个构造方法,这个方法决定了创建出来的线程池的各种属性,下面依靠一张图来更好的理解线程池和这几个参数:(slector多路复用也是类似这种模型---nioEventLoop=selector+taskqueue)
又图中,我们可以看出,线程池中的corePoolSize就是线程池中的核心线程数量,这几个核心线程,只是在没有用的时候,也不会被回收,maximumPoolSize就是线程池中可以容纳的最大线程的数量,而keepAliveTime,就是线程池中除了核心线程之外的其他的最长可以保留的时间,因为在线程池中,除了核心线程即使在无任务的情况下也不能被清除,其余的都是有存活时间的,意思就是非核心线程可以保留的最长的空闲时间,而util,就是计算这个时间的一个单位,workQueue,就是等待队列,任务可以储存在任务队列中等待被执行,执行的是FIFIO原则(先进先出)。threadFactory,就是创建线程的线程工厂,最后一个handler,是一种拒绝策略,我们可以在任务满了知乎,拒绝执行某些任务。
线程池的执行流程又是怎样的呢?
有图我们可以看出,任务进来时,首先执行判断,判断核心线程是否处于空闲状态,有空闲的就用来执行任务,如果不是,核心线程就先就执行任务,如果核心线程已满,则判断任务队列是否有地方存放该任务,若果有,就将任务保存在任务队列中,等待执行,如果满了,在判断最大可容纳的线程数,如果没有超出这个数量,就开创非核心线程执行任务,如果超出了,就调用handler实现拒绝策略。
handler的拒绝策略:
有四种:第一种AbortPolicy:不执行新任务,直接抛出异常,提示线程池已满
第二种DisCardPolicy:不执行新任务,也不抛出异常
第三种DisCardOldSetPolicy:将消息队列中的第一个任务替换为当前新进来的任务执行
第四种CallerRunsPolicy:直接调用execute来执行当前任务
五,四种常见的线程池:
CachedThreadPool:可缓存的线程池,该线程池中没有核心线程,非核心线程的数量为Integer.max_value,就是无限大,当有需要时创建线程来执行任务,没有需要时回收线程,适用于耗时少,任务量大的情况。
SecudleThreadPool:周期性执行任务的线程池,按照某种特定的计划执行线程中的任务,有核心线程,但也有非核心线程,非核心线程的大小也为无限大。适用于执行周期性的任务。
SingleThreadPool:只有一条线程来执行任务,适用于有顺序的任务的应用场景。
FixedThreadPool:定长的线程池,有核心线程,核心线程的即为最大的线程数量,没有非核心线程
参考:https://blog.csdn.net/weixin_40271838/article/details/79998327
相关推荐
本文将深入探讨如何在Winform应用中使用异步多线程和线程池。 一、线程基础 线程是操作系统分配CPU时间的基本单元,每个进程至少包含一个线程。在C#中,可以使用`System.Threading.Thread`类来创建和管理线程。通过...
2. newSingleThreadExecutor:创建一个单线程线程池,所有任务都在一个线程中顺序执行,保证了任务的执行顺序。 3. newFixedThreadPool:创建一个固定大小的线程池,线程数量保持不变,任务排队等待执行。 4. ...
本篇文章将重点探讨两种线程池实现:精易模块线程池和鱼刺模块线程池,并通过源码分析来展示它们的特点和用法。 首先,精易模块(SanYe Module)是由中国程序员SanYe开发的一系列开源模块,其中包含了线程池的实现...
理解并掌握多线程和线程池的知识,对于开发高效、可靠的并发程序至关重要。 总之,多线程和线程池是现代计算机系统中不可或缺的并发编程工具。深入研究这些主题,不仅可以提高编程技能,还能为优化系统性能和解决...
“C线程池”则是指使用C语言实现的线程池,这可能涉及到对pthread库的深入理解和利用,因为C语言本身并不直接支持线程,而是依赖于平台提供的API。开发者需要自己设计数据结构来存储线程和任务,以及实现线程间的...
综上所述,基于C语言实现多线程和线程池涉及的知识点包括:多线程编程、线程池的设计与实现、TCP/IP协议栈的理解、HTTP协议的处理、DNS异步查询、MySQL C API的使用、数据库连接池的设计、以及数据结构和文件操作。...
合理利用AsyncTask、Runnable、Thread、Handler、Looper、线程池和线程同步机制,能帮助开发者设计出更加健壮和高效的Android应用。在实际开发中,应根据任务特性和需求,选择最适合的线程管理方式。通过Demo实践,...
总结来说,理解并熟练运用线程、线程池和Handler是Android开发中的重要技能。它们能够帮助我们编写出更加响应快速、用户体验良好的应用程序。在实际项目中,合理选择线程模型,有效利用线程池进行任务调度,以及正确...
多线程与线程池是Java编程中至关重要的概念,特别是在处理高并发场景时,它们的作用尤为突出。本文将深入探讨这两个主题,并结合标签中的...通过深入理解和熟练运用这些概念,开发者可以编写出更健壮、高效的并发程序。
总的来说,理解线程、线程池以及TCP协议的长连接和短连接特性是软件开发中不可或缺的基础知识。熟练掌握这些概念,有助于编写出更高效、更稳定的程序。学习和实践这些基础,将为你的编程生涯打下坚实的基础。
Java线程、线程池和XML解析是Java编程中至关重要的三个概念,它们在实际开发中扮演着不可或缺的角色。下面将分别对这三个主题进行深入的介绍。 首先,我们来看Java线程。线程是程序执行的最小单位,一个进程可以...
通过分析和理解这个示例,开发者可以更好地掌握Java和Android中多线程和线程池的使用,提升应用程序的性能和响应速度。在实际项目中,合理地配置和使用线程池能够有效优化程序的资源消耗,保证服务的稳定性和可扩展...
在这个"C#线程、线程池和线程间同步的例子"中,我们可以深入学习到如何在VS2008环境下创建和管理线程。 首先,线程是操作系统分配CPU时间的基本单元,每个进程至少包含一个线程。在C#中,我们可以通过`System....
多线程测试”中,我们可以深入探讨如何在实际项目中应用多线程和线程池。这可能包括以下几个方面: 1. **线程同步与通信**:多线程间可能会共享数据,需要确保数据的一致性,避免数据竞争问题。可以使用互斥锁、...
通过分析源代码和执行测试,开发者可以深入理解WebSocket协议的运作机制,以及在实际项目中如何优化性能和资源管理。同时,它还提供了将传统数据库系统(如Visual FoxPro)与现代网络技术结合的可能性,对于熟悉这...
本文将深入探讨C++中实现跨平台线程和线程池的相关知识点。 1. **线程基础**: - 线程是操作系统调度的基本单位,一个进程中可以有多个线程并发执行,共享同一地址空间。 - C++11引入了`<thread>`库,提供了原生...
在IT领域,尤其是在系统编程和...总的来说,C语言的线程池编程涉及到对pthreads库的深入理解和应用,以及对并发控制和任务调度策略的掌握。通过合理设计和实现线程池,可以显著提升多任务环境下的系统性能和响应速度。
通过深入理解Java线程池的工作原理和配置策略,开发者可以有效地优化并发程序,提高系统的响应速度和吞吐量,同时降低系统资源的消耗。因此,对于任何从事Java并发编程的开发者来说,掌握线程池的使用和优化技巧都是...
在C++编程中,多线程技术是一种提升程序性能的有效手段,特别是在处理大量并发任务时。线程池是多线程编程中一个重要的概念,它能够优化系统资源的...这有助于我们更好地理解和应用线程池,优化我们的C++多线程程序。
在这个“c++11线程与线程池Demo 完整vs2013工程”中,我们可以深入理解C++11如何通过`<thread>`库来实现线程管理和线程池的概念。 线程是操作系统分配CPU时间片的基本单元,它允许程序并发执行多个任务,从而提高...