java线程等待状态存在哪里 cxq啥意思?

[更新]
·
·
分类:互联网
3896 阅读

java线程等待状态存在哪里

cxq啥意思?

cxq啥意思?

cxq 是ContentionList,竞争列表的简称的意思。它是一个单向链表。被挂起线程等待重新竞争锁的链表, monitor 通过CAS将包装成ObjectWaiter写入到列表的头部。为了避免插入和取出元素的竞争,所以Owner会从列表尾部取元素。

cpu的核和线程是什么意思?

1、CPU的核心数是指物理上,也就是硬件上存在有几个核心。举个例子,双核就是包括2个相对独立的CPU核心单元组,四核就包含4个相对独立的CPU核心单元组,等等,依次类推。
2、线程数是一种逻辑的概念,也就是模拟出的CPU核心数。
3、例如,可以通过一个CPU核心数模拟出2线程的CPU,也就是说,这个单核心的CPU被模拟成了一个类似双核心CPU的功能。我们从任务管理器的性能标签页中看到的是两个CPU。
4、CPU的线程数概念仅仅只针对Intel的CPU才有用,因为它是通过Intel超线程技术来实现的,最早应用在Pentium4上。如果没有超线程技术,一个CPU核心对应一个线程。所以,对于AMD的CPU来说,只有核心数的概念,没有线程数的概念。
5、CPU之所以要增加线程数,是源于多任务处理的需要。线程数越多,越有利于同时运行多个程序,因为线程数等同于在某个瞬间CPU能同时并行处理的任务数。
6、要保证这些线程,全都不调用阻塞的API。如果有阻塞,有等待,比如要做输出的话,多开几个线程,可能更合适。

如何优雅的使用和理解线程池?你怎么看?

要把java线程池理解好并且用好,需要把并发编程的基础知识掌握好,并且把线程池的所有API的官方文档仔细阅读研究一遍。这里把优雅的使用线程池的要点总结如下:
1. 弄明白你要用线程池做什么。例如你的目的是把同步API改造为异步,还是想要并发请求多个外部服务,还是减少线程的创建和销毁以处理用户请求等。
2. 根据你的实际项目需求,配置好线程池的参数,具体包括corePoolSize, maximumPoolSize, 阻塞队列, keepAliveTime,线程工厂 和 饱和策略(或者说是RejectedExecutionHandler)。
3. 根据你的应用特点部署线程池。有的后台服务应用适合在启动的时候一次性创建好线程池,在应用的执行过程不再修改线程池。有的时候,应用适合临时创建一个线程池并且把任务提交进去,用完之后立即销毁。
4. 当你决定不再使用线程池之后,应该调用shutdown()以优雅的关闭线程池。shutdown可以保证之前已经提交到线程池中的任务不会被丢弃,保证了数据安全。
5. 当调用了shutdown之后,线程池此时已经可能在执行任务,只是关闭了提交任务的入口。如果需要等待线程池完全终止,需要调用awaitTerminate以等待线程池把队列中的任务全部处理完成并且清理完成,然后才返回。awaitTerminate成功返回了,线程池算是真的清理干净了。
总结一下,线程池按照创建(构造方法)、提交任务(execute)、清理(shutdown),等待清理结束(awaitTerminate)的顺序调用API,这样使用线程池才算优雅。要想用好java线程池,最大化优化程序的性能可以参考我公众号里的分析文章。