前言:
- 上篇博文简单讲解了多线程的三种实现方式: https://blog.youkuaiyun.com/zhangyong01245/article/details/100593167
- 本篇博文简单介绍一下 Thread 中常用的方法。
先来看一下线程的状态[图片来自网上]:

方法:
以下的方法在Thread 的源码中均可以查询到,有兴趣的小伙伴可以自行查阅。
-
start() :使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
-
run():如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
-
setName(String name):改变线程名称,使之与参数 name 相同
-
setPriority(int piority) 更改线程的优先级【实际使用效果不明显,有点鸡肋】
-
setDaemon(boolean on) 将该线程标记为守护线程或用户线程【true-守护线程,false-用户线程】
-
join(long millisec) 等待该线程终止的时间最长为 millis 毫秒【有无参方法】
-
interrupt() 线程设置中断标志。
-
isAlive() 测试线程是否处于活动状态
-
yield() 作用是让步,把自己CPU执行的时间让掉,并和其他线程一起重新竞争CPU【注意有可能是自己再次被执行】
-
sleep(long millisec) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响
-
currentThread() 返回对当前正在执行的线程对象的引用
部分方法解释:
-
setDaemon()和isDaemon() 用来设置线程是否成为守护线程和判断线程是否是守护线程,需要在线程启动之前进行调用。
守护线程和用户线程的区别在于:守护线程依赖于创建它的线程,而用户线程则不依赖。举个简单的例子:如果在main线程中创建了一个守护线程,当main方法运行完毕之后,守护线程也会随着消亡。而用户线程则不会,用户线程会一直运行直到其运行完毕。在JVM中,像垃圾收集器线程就是守护线程, -
join(long millisec) 等待该线程终止的时间最长为 millis 毫秒或者到线程执行结束【无参或者参数为0会一直等待线程执行结束】,源码:
/**
* 参数值为0,表示一直等待,知道线程执行结束
* 不为0, 等待到线程结束 或者 超时返回
* @param millis 毫秒
* @throws InterruptedException
*/
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
// 线程是否处于活动状态
while (isAlive()) {
// java原生方法,参数0表示,一直等待线程到结束
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
// java原生方法,参数不为0表示,一直等待线程到结束,或者到指定delay时间结束
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
- interrupt() 线程设置中断标志,一般用于在外部设置该线程的中断点,结合 interrupted() isInterrupted() 方法结束run 方法。
需要注意的是 :
interrupt() :线程设置中断标志,并不会结束线程。
isInterrupted(): 返回调用此方法的线程是否有中断标志,不会去除中断点【注意作用范围,调用的线程】
interrupted():是 Thread中的 static 方法,调用方式 Thread.interrupted(),根据其代码 currentThread().isInterrupted(true); 可知,其返回的是当前线程的中断状态。 和isInterrupted()的区别一个是调用者的线程状态,一个是当前线程的状态, interrupted() 调用后会返回线程是否有中断标志,并且会移除线程的中断状态。
注意: 当线程方法wiat、join、sleep三种方法之一,在起作用时,调用它的 interrupte()方法,会生成一个InterruptedException异常,没有占用CPU 运行的线程是不可能给自己一个中断状态置位的。
更详细讲解: https://blog.youkuaiyun.com/zhangyong01245/article/details/100711341
- sleep、wait、notify()、notifyAll()
sleep 的作用是使当前线程睡眠指定的时间,放弃对CPU的占用,但是不会放弃对线程以获取到的锁
wait() : 会将当前线程进入休眠状态,并且释放当前获取到的对象锁,并将当前线程放入到等待池中,等待notify、notifyAll 将其唤醒并进入锁池中竞争对象锁,
notify 从等待池中随机选择【和优先级也有关】唤醒其中一个线程,进入到锁池中等待对象锁,并执行,其他等待池中线程继续等待。
notifyAll 将等待池中所有的线程全部唤醒到锁池中,然后去竞争对象锁,
更详细讲解: https://blog.youkuaiyun.com/zhangyong01245/article/details/100746128

被折叠的 条评论
为什么被折叠?



