Java 多线程方法详解

?写在前面?

🧭Java 多线程
🎉 内容回顾
Java 多线程介绍及线程创建
Java 多线程七大状态
📢今天我们进行 Java 多线程方法详解 的学习,感谢你的阅读,内容若有不当之处,希望大家多多指正,一起进步💯!!!
??如果觉得博主文章还不错,可以👍三连支持?一下哦😀

文章目录
  • Java 多线程方法详解
    • start
    • run
    • yield
    • join
    • sleep
    • Interrupt
    • deamon
    • Priority
【Java 多线程方法详解】
Java 多线程方法详解 start
start方法 启动线程 在start方法中调用start0方法,而start0是一个本地方法,其底层是C++实现的,其调用原理在博客Java 多线程介绍及线程创建中有详细的阐述 。
public synchronized void start() {if (threadStatus != 0)throw new IllegalThreadStateException();group.add(this);boolean started = false;try {start0();started = true;} finally {try {if (!started) {group.threadStartFailed(this);}} catch (Throwable ignore) {}}}private native void start0(); run
run 方法 子线程的执行体,在其方法体中编写线程逻辑,run方法和普通成员方法一样,可以重复调用,当我们单独调用run方法时会在当前线程中执行run方法,并不会启动新线程 。

yield
yield 方法线程让步暂停当前线程的执行,并让步于其他同优先级的线程,让其他线程先执行
yield方法是Thread类中的静态方法
public static native void yield(); 🚀特点
  • yield方法的让步,能让正在执行的线程由“运行状态”进入到“就绪状态”,等待调度执行 。
  • yield仅仅是让出CPU资源,让给谁,是有系统决定的,系统会让其他相同优先级或者是更高优先级的线程来获取执行权,要是没有更高优先级的线程,会继续执行原来的线程 。
join
join 方法 线程合并 暂停当前线程的执行,等待子线程执行完毕再继续执行当前线程,也叫做线程插队,join方法做的事情就是讲并行或并发执行的线程合并为串行执行 。
代码示例:
public class ThreadMethod02 {public static void main(String[] args) throws InterruptedException {T2 t2 = new T2();t2.start();//主线程打印int count = 0;for (int i = 1; i <= 10; i++) {Thread.sleep(1000);System.out.println("main" + i);if (++count == 5) {t2.join();//子线程插队}}}}class T2 extends Thread {@Overridepublic void run() {for (int i = 1; i <= 10; i++) {try {Thread.sleep(1000);//休眠一秒钟} catch (InterruptedException e) {e.printStackTrace();}System.out.println("A" + i);}}} 运行结果:
sleep
sleep线程休眠,在sleep期间,线程运行状态从运行进入到阻塞状态,会让出CPU的执行权,当线程被重新唤醒时,会由阻塞状态进入到就绪状态,等待CPU的使用权
方法介绍:
  • sleep方法主要有两个,sleep(long millis)sleep(long millis, int nanos)两个方法功能类似,后一个方法提供更高精度的纳秒级控制 。
  • sleep方法是Thread里提供的静态方法,当前的方法也是可以抛出InterruptedException异常,可以被Interrupt中断掉 。

Interrupt 代码示例:
Interrupt中断线程 interrupt方法调用仅仅修改了一个中断标志 。如果当前线程是可中断的状态(调用了sleep、join、wait等方法导致线程进入阻塞状态)在其他线程中调用interrupt方法,会立即抛出一个InterruptedException异常,来停止掉中断 。如果当前处于运行状态,调用interrupt方法,线程会继续执行,直到发生sleep、join、wait等方法的调用,才会进入阻塞 。
Interrupt方法在Thread类中,是一个普通方法,可以通过对象来调用 。
public class ThreadMethod03 {public static void main(String[] args) throws InterruptedException {T3 t3 = new T3();t3.start();for (int i = 0; i < 3; i++) {Thread.sleep(1000);System.out.println(Thread.currentThread().getName());}t3.interrupt();//发送中断}}class T3 extends Thread {@Overridepublic void run() {for (int i = 0; i < 3; i++) {System.out.println("A");}try {System.out.println("进行休眠");Thread.sleep(20000);} catch (InterruptedException e) {System.out.println(Thread.currentThread().getName() + "被Interrupted!!!");}}} 运行结果:
deamon
deamon 方法 守护线程 Java线程有两种,一种是守护线程,一种是用户线程,用户线程一般用户执行用户级任务,一般创建的线程都是用户线程,守护线程也叫做“后台线程”服务于用户线程,一般就是用来执行后台任务,例如:垃圾回收就是由专门线程来处理的,负责垃圾回收的线程就是守护线程 。
守护线程存在两个方法
  • public final void setDaemon(boolean on)
    设置守护线程,参数是true和false,true表明设置为守护线程, false,设置为非守护线程 ,默认是false 。
  • public final boolean isDaemon()
    判断是否守护线程,返回Boolean类型
代码示例:
public class ThreadMethod04 {public static void main(String[] args) throws InterruptedException {T4 t4 = new T4();t4.setDaemon(true);//将子线程设置为守护线程t4.start();if (t4.isDaemon()) {//判断是否是守护线程System.out.println("子线程是守护线程");}else {System.out.println("子线程不是守护线程");}for (int i = 1;i <= 5;i++) {Thread.sleep(1000);System.out.println(Thread.currentThread().getName() + i);}}}class T4 extends Thread {@Overridepublic void run() {while (true) {//无限循环try {Thread.sleep(1000);// 休眠1s钟} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName());}}} 运行结果:
主线程结束,子线程同时结束
Priority
Priority线程优先级,就是用来指导线程执行的优先权
方法介绍
  • public final void setPriority(int newPriority):设置线程的优先级
  • public final int getPriority():获取线程的优先级
优先级范围
设置Java线程的优先级,最小值为1,默认值是5,最大值是10
public final static int MIN_PRIORITY = 1;public final static int NORM_PRIORITY = 5;public final static int MAX_PRIORITY = 10; 方法特点
1. 线程的优先级并不绝对,所控制的是执行的机会,优先级高的线程执行的概率是比较大,而优先级低的线程也并不是没有机会,只是执行的概率会低一些 。
2. 优先级共10个优先级,分别为1-10,数值越大,表明优先级越高,普通的线程优先级是5 。
3. 线程的优先级是用来指导JVM层面优先哪个线程执行,最终执行顺序还是需要操作系统来指定 。
4. 注意:代码最好不要依赖于优先级线程,有可能会造成问题,Java中给定的优先级并不一定严格按照给定优先级执行 。
代码示例:
public class ThreadMethod05 {public static void main(String[] args) {T5 t5 = new T5();t5.setPriority(10);//设置优先级为10int priority = t5.getPriority();//获取优先级System.out.println(priority);}}class T5 extends Thread {@Overridepublic void run() {System.out.println("A");}} 运行结果: