原文链接:线程常用调度方法 – 编程屋
目录
一 线程等待
1 wait():当一个线程调用了wait()方法后,这个线程会被阻塞挂起,直到发生了下面几种情况才会返回
1)线程调用了notify()或者notifyAll()唤醒方法
2)其他线程调用了线程的interrupt()中断方法,线程抛出InterruptedException异常返回。
2 wait(long timeout):这个方法比wait()方法多了一个超时参数timeout,如果线程调用这个方法后,没有在指定的timeout时间内被唤醒,那么这个方法会因为超时返回。
3 wait(long timeout,int nacos):和wait(long timeout)类似,也是带有超时时间的wait,内部调用的也是wait(long timeout)方法
4 join():让父线程等待子线程结束之后继续执行,即当我们调用某个线程的join()方法时,这个方法会挂起调用线程,直到被调用线程结束执行,调用线程才会继续执行。
二 线程通知
1 notify():当线程调用notify()方法后,会唤醒一个在这个锁资源上调用wait()方法后被挂起的线程。一个锁资源可能会有多个线程在等待,具体唤醒哪个等待线程是随机的。
2 notifyAll():notify()是唤醒一个在等待的线程,而notify()方法则会唤醒所有在该锁资源上由于调用wait()方法而被挂起的线程。
三 线程休眠
1 sleep(long millis):sleep方法是Thread类的静态方法,当一个执行中的线程调用了sleep()方法后,这个线程会暂时让出指定时间的CPU执行权,但是线程所拥有的监视器资源,比如锁还是持有不让出的。当指定的睡眠时间到了之后sleep()方法会正常返回,接着参与调用CPU的调度,获取到CPU资源后会继续执行。
四 请求让出CPU执行权
1 yield():是Thread类中的静态方法,当一个线程调用yield方法后,其实是告诉线程调度器当前线程请求让出自己的CPU,让自己或者其他线程运行,但是线程调度器可以无条件忽视这个提示。
使当前线程从执行状态(运行状态)变为可执行状态(就绪状态)。CPU会从众多的可执行状态里选择。也就是说调用了yield()方法的那个线程还是有可能会被再次执行的,并不是说一定会执行其他线程而该线程在下一次就不会执行到了,取决于线程调度器的选择。
demo演示:
public class YieldDemo extends Thread{
public YieldDemo(String name) {
super(name);
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(this.getName()+"-----"+i);
if (i == 5 ) {
System.out.println(""+this.getName()+"--请求线程调度器让出CPU执行权给其他线程或者自己执行");
Thread.yield();
}
}
}
public static void main(String[] args) {
new YieldDemo("张三").start();
new YieldDemo("李四").start();
}
}
演示结果:
五 线程中断
1 void interrupt():中断线程的方法,将会设置该线程的中断标志为true,中断的结果线程是死亡,还是等待新的任务或是继续运行下一步,就取决于程序本身。线程会时不时的检测这个中断标志位为true,以判断线程是否应该被中断。
例如:当线程A运行时,线程B可以调用interrupt()方法来设置线程的中断标志为true并立即返回。设置标志仅仅是设置标志,线程A实际没有被中断,会继续向下执行。
2 boolean isInterrupted():判断某个线程是否已被发送过中断请求,即检测当前线程是否被中断,isInterrupted()不会清除中断标志位。
3 boolean interrupted():检测当前线程是否被中断,与isInterrupted不同的是,该方法如果发现当前线程被中断,则会清除中断标志。isInterrupted()会清除中断标志位,将其设置为false。
以上只是部分内容,为了维护方便,本文已迁移到新地址:线程常用调度方法 – 编程屋