java.lang.Thread
1、线程属性:编号(ID-long,只读)、名称(Name-String,)、线程类别(Daemon-boolean:true为守护线程,false为用户线程)、优先级(Priority-int)
2、常用方法:start() 启动线程;run() 实现线程的任务处理逻辑;join() 等待相应线程运行结束;currentThread() 返回当前线程,即代码的执行线程(对象);yield() 使当前线程主动放弃其对处理器的占有,这可能导致当前线程被暂停; sleep(long millis) 使当前线程休眠(暂停运行)指定时间。
任务
1、特定的线程总是在执行特定的任务
2、线程的run方法是线程的任务处理逻辑的入口方法
创建线程的方法
1、创建Thread子类的run方法中直接实现任务处理逻辑;
2、以Runnable接口实例为构造器参数直接new创建Thread实例。(优先选择)
线程与代码直接的关系
1、任何一段代码都是运行在确定的线程之中
2、同一段代码可以被多个线程执行
3.代码可以通过调用Thread.currentThread()来获取其当前执行线程
线程层次关系
1、父线程子线程只是便于称呼的一种相对概念
2、java平台中并没有API用于获取一个线程的父线程或者获取一个线程的所有子线程
3、父线程子线程之间的生命周期相对独立
线程状态
1、新建而未运行:NEW
2、可被调度运行或者正在运行:RUNNABLE 包含;两个子状态 READY 和 RUNNING
3、阻塞:BLOCKED
4、等待:WAITING、TIMED_WAITING
5、结束:TERMINATED
线程的监视
1、获取与查看线程转储(Thread Dump)
2、工具
2.1、平台无关
方法1:执行命令: jstack -l PID(java程序的进程ID),windows可用jps命令获取,Linux可用ps获取;
方法2:单击图形化工具jvisualvm中的Thread Dump按钮,jdk主目录/bin/jvisualvm。jdk11貌似没有。
方法3:单击图形化工具Java Mission Control (JMC),jdk主目录/bin/jmc。jdk11貌似没有。
2.2、特定于Linux
方法4:执行命令:kill -3 PID
方法5:在启动Java程序的控制台按下“CTRL+\”组合键
2.3、特定于Windows
方法6:在启动Java程序的命令行提示窗口中按下“CTRL+Break”组合键;笔记本键盘找不到Break键。
无处不在的线程
main线程、垃圾回收线程、Web服务器请求处理线程、JIT(Just In Time)即时编译线程
多线程的优势和风险
优势
1、提高系统的吞吐率
2、提高响应性
3、充分利用多核处理器资源
4、最小化对系统资源使用
5、简化程序的结构
风险
1、线程安全问题
2、线程的活性(Liveness)问题
3、上下文切换
4、可靠性