1、创建和运行线程
直接用Thread
—->
此写法为匿名内部类,实际创建了一个Thread的子类,并且需要重写其中的run方法(其中写要执行的代码),最后需要调用start方法真正启动该线程。(还可以用setname指定线程名)
使用Runnable配合Thread(更推荐)
—->
Runnable接口中有,代表可以用lambda表达式简化。 —->—-> 进阶:
FutureTask配合Thread
→
其继承了Runnable接口,知识多了get方法可以抛出异常和接收返回结果。
观察多个线程同时运行
—->
linux下查看进程和线程的方法
推荐:ps -fe | grep 关键字 来查看
2、线程运行原理
栈与栈帧
—-> —-> —-> 最后return n 局部变量表是每个线程私有的,程序计数器记录线程中执行到的代码行数。 方法区存放代码的字节码
线程上下文切换
Thread的常见方法
run和start
—->
直接调用run方法而不去调用start方法无法启动线程
sleep与yield
sleep方法需要传入int参数(毫米单位)作为休眠时间 sleep方法并不会释放锁 Timeunit方法可以指定休眠时间单位
sleep方法小应用
jion(底层原理为wait)
—->
使用jion可以解决
—->jion等待线程运行结束。
应用:
1. 2.
interrupt
sleep、wait被interrupt打断后打断标记会被重置为false 正常运行的线程被interrupt打断后打断标记为true。
此时打断主线程并不会影响到t1线程
t1中获取打断标记,退出循环(非强制退出,t1线程内还可以自主决定执行一些代码,优雅退出。)
补充:两阶段终止模式
监控线程 被监控的对象
常见方法
interrupt打断park线程
1.
不会执行下面的语句
2.
interrupt打断后
后面的语句被执行了,打断标记置真
3.
打断后upark方法仍然执行,因为打断标记为true,park失效。
解决: 打断标记会被设为false
不推荐使用方法
主线程与守护线程
—->
主线程运行结束后,守护线程t1强制结束了。
线程状态
五种状态
六种状态
详细:
https://www.bilibili.com/video/BV16J411h7Rd?p=110&spm_id_from=pageDriver