线程常用调度方法

原文链接:线程常用调度方法 – 编程屋

目录

一 线程等待

二 线程通知

三 线程休眠

四 请求让出CPU执行权

五 线程中断


一 线程等待

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。

以上只是部分内容,为了维护方便,本文已迁移到新地址:线程常用调度方法 – 编程屋

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值