1、创建和运行线程

直接用Thread

image.png—->image.png

此写法为匿名内部类,实际创建了一个Thread的子类,并且需要重写其中的run方法(其中写要执行的代码),最后需要调用start方法真正启动该线程。(还可以用setname指定线程名)

使用Runnable配合Thread(更推荐)

image.png—->image.png

image.pngRunnable接口中有image.png,代表可以用lambda表达式简化。 image.png—->image.png—-> 进阶:image.png

image.png 组合优于继承

FutureTask配合Thread

image.pngimage.png

其继承了Runnable接口,知识多了get方法可以抛出异常和接收返回结果。


观察多个线程同时运行
image.png—->image.png

linux下查看进程和线程的方法
image.png推荐:ps -fe | grep 关键字 来查看


2、线程运行原理

栈与栈帧

image.png
image.png

image.png—-> image.png—-> image.png—-> image.png最后return n 局部变量表是每个线程私有的,程序计数器记录线程中执行到的代码行数。 方法区存放代码的字节码


线程上下文切换
image.png


Thread的常见方法

image.png
image.png

run和start

image.png—->image.png

直接调用run方法而不去调用start方法无法启动线程

启动线程必须用start
image.png—->image.png—->image.png

sleep与yield

image.png

sleep方法需要传入int参数(毫米单位)作为休眠时间 sleep方法并不会释放锁 Timeunit方法可以指定休眠时间单位image.png

sleep方法小应用 image.png

image.png

jion(底层原理为wait)

image.png—->image.png

image.png

使用jion可以解决
image.png—->image.pngjion等待线程运行结束。
应用:
image.png

1. image.pngimage.png 2. image.pngimage.png

image.png

interrupt

image.png

sleep、wait被interrupt打断后打断标记会被重置为false 正常运行的线程被interrupt打断后打断标记为true。

image.png此时打断主线程并不会影响到t1线程
image.pngt1中获取打断标记,退出循环(非强制退出,t1线程内还可以自主决定执行一些代码,优雅退出。)

补充:两阶段终止模式

image.png
image.png

image.png监控线程 image.png 被监控的对象

常见方法

interrupt打断park线程

1.
image.png
image.png不会执行下面的语句
2.
image.pnginterrupt打断后
image.png后面的语句被执行了,打断标记置真
3.
image.png
image.png打断后upark方法仍然执行,因为打断标记为true,park失效。

解决: image.png打断标记会被设为false


不推荐使用方法
image.png


主线程与守护线程

image.png
image.png—->image.png
image.png主线程运行结束后,守护线程t1强制结束了。

image.png

线程状态

五种状态

image.png

image.png

六种状态

image.png

image.png

详细:

https://www.bilibili.com/video/BV16J411h7Rd?p=110&spm_id_from=pageDriver