-
进程与线程的区别?
进程是一个执行单元
每个进程内至少有一个线程、线程是进程的执行路径,线程也称为轻量级进程 -
线程的状态(生命周期)
NEW ----创建一个线程、此时线程尚未被启动,未调用start()方法
RUNNABLE -----调用了start()方法、等待CPU轮询调度轮询此任务线程
RUNNING -----此时CPU轮询到此线程、线程开始执行
BLOCKED -----此时线程进入锁状态、调用了Thread.sleep()、Object.wait()方法等
TERMINATED -----线程最终状态、正常结束任务、或者异常结束 -
线程的启用方式
继承Thread类、重写run方法、调用start()启动一个线程
实现RUNNABLE接口的run方法、(主要用于实现共享数据),启用线程的方式就只有构造Thread一种、实现线程的执行单元有两种、执行单元则为run(); -
线程中run()和start()的方法的区别
Thread.run()是线程的执行单元
Thread.start()启动线程的方式 -
线程中监控工具
jconsole与jstack查看线程状态
在生产者消费者模式中,建立线程池,可以通过Jstack命令
jstack ,
(1)jps查询到当前线程号,
(2)jstack pid > ./dump名称,
(3)查看dump文件查看Waiting的线程在做什么 查看所有线程状态:jstack pid |grep java.lang.Thread.State|awk ‘{print 22234445}’ |uniq -c 统计当前线程下所有状态 -
为什么要使用多线程?多线程中面临的挑战是什么?(多线程名称解析)
并发编程中是为了让程序更快的得到执行、而不是启动更多的线程取处理问题
-
上下文切换
上下文切换:即使是单核处理器也支持多线程程序、CPU会给每个线程分配时间片、cpu在不停的轮换线程、每次轮换都会记录切换前的状态、时间片一般为几十毫秒。
单线程不一定会比多线程慢、如果数据量比较小的情况下、由于频繁的上下文切换、可能会导致单线程时间小于多线程处理时间
测试上下文切换次数与时间的工具、Lmbench3测试上下文时长、vmstat命令可以测试上下文切换的次数 -
如何减少上下文切换
无锁并发编程、(多线程竞争锁的时候,会频繁的引起上下文切换)
CAS算法
使用最少线程,避免创建不需要的线程、比如任务很少、但是缺创建的很多线程来处理
协程:单线程实现多任务的调度、并在单线程里维持多个任务间的切换。 -
减少上下文切换实际操作
通过jstack查看处于waiting状态的闲置线程、然后在线程池设置中调整最大线程数,(减少最大线程数)
JAVA高并发之线程的概念
最新推荐文章于 2022-09-01 10:41:40 发布