线程池,怎么停止线程池中的线程?
1.自然终止。
你的线程执行完它启动时运行的方法,就自然终止了。适用于单个或多个一次性任务。如果是多个,这种情况推荐线程池。把任务写成线程池的Task。
2.有个管理线程,去调用工作线程的workingThread.Interrupt()方法。前提是,用一些同步机制防止工作线程的工作做一半被扔那了。
这种办法适用于循环等待某些任务的线程,比如TCPListener的循环Accept的线程或者其它响应消息的线程,或者接收/处理心跳消息的线程。
线程池处理流程是什么?
提交任务后,线程池先判断线程数是否达到了核心线程数(corePoolSize)。如果未达到线程数,则创建核心线程处理任务;否则,就执行下一步;
接着线程池判断任务队列是否满了。如果没满,则将任务添加到任务队列中;否则,执行下一步;
接着因为任务队列满了,线程池就判断线程数是否达到了最大线程数。如果未达到,则创建非核心线程处理任务;否则,就执行饱和策略,默认会抛出RejectedExecutionException异常。
如何监控Java线程池运行状态?
如果想监控一个线程池的执行状态,线程池执行类ThreadPoolExecutor给出了相关的 API, 能实时获取线程池的以下信息:
当前活动线程数
正在排队中的线程数
已经执行完成的线程数
总线程数
……
总线程数 = 排队线程数 + 活动线程数 + 执行完成的线程数
1. 代码示例
创建ThreadPoolExecutor实例:
通过ThreadPoolExecutor的API来获取线程运行信息:
2. 代码运行分析
线程池提交了 100000 个任务,但同时只有 50 个线程在工作,我们每间隔 3 秒来获取当前线程池的运行状态。
2.1 第一次程序输出
当前排队线程数:99950
当前活动线程数:50
执行完成线程数:0
总线程数(排队线程数 + 活动线程数 + 执行完成线程数):100000
2.2 第二次程序输出
当前排队线程数:99800
当前活动线程数:50
执行完成线程数:150
总线程数(排队线程数 + 活动线程数 + 执行完成线程数):100000
2.3 最后输出
当前排队线程数:0
当前活动线程数:0
执行完成线程数:100000
总线程数(排队线程数 + 活动线程数 + 执行完成线程数):100000
因此,了解清楚这些 API 的使用方法后,我们想监控线程池的状态就非常方便了。
欢迎关注笔者,持续分享有价值的优质架构文章。
如何深入Java多线程开发?
谢谢邀请
java多线程的开发属于java编程里面高级层面应用,实际中应用的场景非常多,举个简单的例子,同时下载多个文件,同时接收多条数据,多个操作同时操作一个数据块等等这方面涉及到的非常多,在开发app或者企业级应用方面都会涉及到。
简单的来说多线程编程几乎是所有编程语言里面比较难的部分了,java经常提到的线程池核心也是这部分,其实多线程就是并发问题,为了提升效率,正常的多个事情可以事先排好队列一个个的来也可以把事情做的很好,但是如果每个人都能去找前台解决问题是不是更好,所以多线程的概念就出来了,在这当初算是软件行业一个革命性的突破,现在几乎所有的编程语言都具备这种属性。多个人一起做事情,但如果共同操作一个数据块岂不是要打架,于是临界区的概念以及线程锁也就出来了。保证在操作同一个数据区域的时候遵守一个规则,一个数据在一个时间段内只能有一个人来操作。
现在推荐几本多线程和并发编程书籍
java并发编程实战
java多线程编程核心技术
基本上两本书看完对于多线程的以及并发性有一个大概的了解,然后自己写个多线程操作的例子,可以写个同时下载多个文件的例子。
多线程在网络编程里面涉及到的非常多,这块骨头啃不下就不要说对java已经很熟悉了。
第一步,建议先学好操作系统这门课,深入理解进程和线程,理解线程的状态转换和调度;
第二步,学习Java中线程的操作,Java对象的多线程特性,练习使用Java代码操作线程和调度线程,线程池等高级操作;
第三步,学习并理解高手的多线程代码。
对于新手来说多线程无疑最难理解的部分,平常我们练习最多的就是输出一些参数,从db中增删改查操作一些数据,这些都是单线程所做的事情,如果遇到了大数据量的处理,IO密集型的任务以及高并发的处理,这时就得用到多线程。
常用的实现方式就是继承thread,或者实现Runnable接口,还有一种带有返回值的方式,即实现callable接口来实现多线程的处理。当然线程频繁的启动和关闭是很耗资源的,于是就使用到了线程池。可以先学会使用java自带的四种线程池,然后理解线程池的原理,比如corePoolSize核心线程数,maxPoolSize最大线程数,线程拒绝策略等。
单核cpu同时只能运行一个线程,在java中的线程是随机执行的,内存中会有程序计数器记录线程执行到了哪里,由于线程的切换时间很短,肉眼看起来好像同时执行多个线程。所以单核cpu只能实现并发,而多核cpu才能使用多线程实现并行,充分利用cpu资源。
接下来多线程肯定会了解到线程安全的问题,实现线程安全的几种方式,比如synchronized,lock,volatile,final关键字,Atomic类,countdownlatch,concurrent包下的类,CAS的实现原理,TLAB(thread local buffer allocation),线程优先级运行状态,同步异步,以及由于锁竞争导致的死锁,守护线程的作用等。
欢迎大家留言讨论