121.线程调度:join()方法与yield()方法

线程调度

【介绍】
线程调度是指【凡是可以影响线程】的【状态】的方法,就成为调度方法;
【方法】

<1>start新建 --> 就绪
<2>sleep 运行 --> 阻塞 会抛出编译异常,需要捕获;
<3>join 加入、合并 运行 --> 阻塞
<4>yield 礼让 运行 --> 就绪
<5>wait 等待 运行 --> 阻塞
<6>notify/nofifyall 唤醒 阻塞 --> 就绪

线程的五大状态:就是 就绪 --> 运行 --> 阻塞

[1]join()方法 实例方法,加入、合并、插队
在当前线程中,执行另一个线程的join方法,然后当前线程就会阻塞,等待插入的线程执行完毕之后,才会从阻塞状态进入到就绪状态,重新参与CPU抢夺;类似实际生活中的插队的现场;

就绪状态的线程的抢占发生在任意时期

class Demo{
    public static void main(String[] args) throws InterruptedException {
        //sleep()静态方法
        //线程暂停1秒 1000毫秒
        Thread.sleep(1000);
        //join()方法
        //在当前线程里面执行另一个线程的join方法,然后当前线程就会阻塞
        //等待插入的线程执行完毕之后,才会从阻塞状态进入到就绪状态,重新参与CPU抢夺
        //类似实际生活中的插队现场
        //就绪状态的线程的抢占发生在任意时期;
        Thread thread = new Thread(()->{
            for(char c = 'a';c <= 'z';c++){
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("插入线程:"+c);
            }
        });
        //让另一个线程,加入进来
        //设置线程的优先级
        thread.setPriority(3);
        thread.start();
        //第一个线程
        Thread thread1 = new Thread(()->{
             for(int i=1;i<100;i++){
                 if(i==3){
                     try {
                         //将thread线程合并到thread1线程中,会将thread阻塞
                         //也就是当前线程在执行时,当前线程阻塞,然后另一个线程执行;
			//当插入进来的线程执行完毕之后会通知本线程,由堵塞变成就绪状态
                         thread.join();
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
                 }
                 System.out.println("第一个线程:"+i);
             }
        });
        //启动线程
        thread1.start();
    }
}

[2]yield()实例方法,礼让 让线程的状态从运行状态改变为就绪状态;
可以让当前正在运行的线程暂停,但是不会让当前的线程阻塞,而且让当前的线程进入到就绪状态
实际上:线程执行yield之后,只有比当前线程的优先级更高或者相同的才有机会参与抢夺CPU,而且当前线程也会参与抢夺;

举例:QQ群发红包,发红包的人就是当前运行线程,发红包的人是否可以参与红包的抢夺,调用yield方法,其实就是发红包的人也参与抢夺;

让CPU稍微空闲,把机会让给其他线程;

class Demo2{
    public static void main(String[] args) {
        //演示yield礼让
        //1.第一个线程
        Thread thread = new Thread(()->{
            for(int i=1;i<20;i++){
                if(i%3==0){
                    //被3整除,就礼让一次
                    Thread.yield();
                    //礼让的时候也就是本线程就会暂停,从运行状态变成就绪状态;
                    //但是也不影响下次线程继续进行抢CPU;
                    //也就是虽然自己礼让了,但下次自己也是可能抢到CPU的
                }
                System.out.println("第一个线程:"+i);
            }
        });
        //启动线程
        thread.start();
        //2.第二个线程
        Thread thread1 = new Thread(()->{
            for(int i=100;i<120;i++){
                System.out.println("第二个线程:"+i);
            }
        });
        thread1.start();
    }
}

【sleep()与join()与yield()的区别】

参考文章:https://blog.csdn.net/xiangwanpeng/article/details/54972952

yield()方法和sleep()方法类似,不会释放锁标志,区别在于yield() 方法能使线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后又马上 被执行,另外yield()方法只能使同优先级或高优先级的线程得到执行机会;而sleep()方法会使所有优先级的获取机会;而join()方法是进入阻塞,等到了插入的线程执行完毕之后,暂停的线程才由阻塞状态变成就绪状态,参与线程的抢夺;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值