Thread中的一些方法(线程状态相关)
1 join()
该方法的作用是让调用该方法的线程加入,让当前线程阻塞,当调用该方法的线程结束后返回。
基本原理如下图所示:
package com.thread;
public class JoinTest {
public static Object obj = new Object();
public static void main(String[] args) {
//创建线程A
Thread threadA = new Thread(() -> {
synchronized (obj) {
System.out.println("线程A启动了");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程A结束了,返回到main线程了");
}
});
threadA.start();
//线程A插入执行,main线程阻塞
try {
threadA.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main线程结束了");
}
}
代码执行后可以看到main线程在threadA执行后才输出"main线程结束了"
2 sleep()
是Thread类的静态方法,会使线程进入阻塞休眠状态,但并不会释放该线程持有的锁,当休眠结束后会返回线程进入就绪状态
package com.thread;
public class SleepTest {
public static Object obj = new Object();
public static void main(String[] args) {
Thread threadA = new Thread(() -> {
synchronized (obj) {
System.out.println("线程A持有锁,并休眠2s");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程执行结束并释放锁");
}
});
Thread threadB = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj) {
System.out.println("线程B持有锁");
}
});
threadA.start();
threadB.start();
}
}
根据运行结果可见,线程A现持有锁,在休眠期间并不会释放锁,故线程B不会进入同步代码块,当线程A执行结束释放锁后才会得到锁并执行同步代码块中的内容。
3yield()
该方法是静态方法,当某个线程调用该方法时,是告诉CPU调度器当前线程请求让出CPU,但CPU可以完全忽视该请求,也就是说该方法是否能请求成功由CPU调度器决定。
4 interrupt()
1 interrupt():线程A运行时,线程B可以调用线程A的interrupt()方法,将线程的中断标志设置为true,注意中断标志是每一个线程的一个属性,该方法只会让改属性的值变为true而不会中断线程A,线程A可以利用改属性实现自身的中断逻辑。
2 isInterrupted():当调用该方法的线程的中断标志为true则返回true,否则返回false;
3 interrupted():该方法是一个静态方法,检测当前线程是否被中断,是则返回true,并重置该线程的中断标志,否则返回false(注意这十个静态方法,并且判断的是当前线程的中断标志,所以哪个线程里调用该方法就是判断哪个线程的中断标志)
package com.thread;
public class InterruptTest {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
for (; ; ) {
}
});
thread.start();
thread.interrupt();
System.out.println(thread.isInterrupted());//true
System.out.println(thread.interrupted());//false
System.out.println(Thread.interrupted());//false
System.out.println(thread.isInterrupted());//true
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main is over");
}
}
thread.interrupted()与Thread.interrupted()都是去判断main线程的中断标志