JavaThread 07 线程五大状态 → 线程礼让&&合并线程(线程插队)

3.2 线程礼让&&线程强制执行


3.2.1 线程礼让

  • 线程礼让:让当前正在执行的线程暂停,但不是阻塞!
  • 线程礼让不会让程序阻塞,而是直接转为 就绪状态
  • 本质上,就是 让 CPU 重新对该线程 进行调度,所以我们说 礼让还不一定成功呢 ~ 这得 看 CPU 的心情!

格式:Thred.yield();

它的意思就是,让你直接回到 就绪状态。然后再经过 CPU 调度。这个时候,如果 还有线程 比你慢,那就说明 它命不好。可能在你回到就绪状态的时候,正好 CPU 把你排在了 它的 前面。(但这也是 针对于还没有进入运行状态的线程。)


情景解释:小明已经跑出去 十米了,但是小红刚来到起跑线位置,就跟小明说,你回来一趟,咋俩竞赛一次。看看谁跑的快!

package www.muquanyu.lesson03;

public class YieldDemo {

    public static void main(String[] args) {
        MyYield myYield = new MyYield();
        new Thread(myYield,"线程A").start();
        new Thread(myYield,"线程B").start();

    }


}

class MyYield implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"-->线程开始执行");
        //线程礼让
        Thread.yield();
        System.out.println(Thread.currentThread().getName()+"-->线程停止执行");
    }
}
  • 礼让成功
    在这里插入图片描述
  • 礼让失败
    在这里插入图片描述
    礼让是不一定成功的,你看 我们的两个线程,其实 都进行了礼让。但是 不一定 谁能礼让成功!礼让这个东西 其实 还是要 看 CPU 的心情。

3.2.2 合并线程(插队线程)

  • Join 合并线程,待此线程执行完毕后,再执行其它线程,其它线程会进入阻塞状态。
  • 可以 想象 成 插队现象!

为什么叫 合并线程?而不是 插队 线程呢?

答:这是因为,Join 是在 一个线程里面,写入 Join(插队的线程),才会导致 该线程进入 阻塞状态的。这种代码,给人的感觉,就像是 合并了线程一样,只不过 合并过来的线程,优先级比较高,而且 还会 阻塞 之前的线程。

package www.muquanyu.lesson03;

public class JoinDemo {

    public static JoinThread joinThread = new JoinThread();
    public static Thread VIP = new Thread(joinThread,"VIP线程");

    public static void main(String[] args) {

        MyThread myThread = new MyThread();
        Thread A = new Thread(myThread,"线程A");

        A.start();


    }

    public static class MyThread implements Runnable{
        @Override
        public void run(){
            System.out.println("开始排队");
            try {
                VIP.start();
                VIP.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("我草,才轮到我?");
        }
    }

    public static class JoinThread implements Runnable{
        @Override
        public void run() {
            System.out.println("哈哈,VIP进行插队!");
            for(int i = 0;i<3;++i)
            {
                try {
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName()+"-->"+i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }
    }
}

上述代码,可以看出。我们的 A线程已经开始运行了,但是呢,突然在 代码的中间 插入了 B线程的 启动 和 join!一下子 就让 A 线程阻塞了。而且 B线程 也 持续的 在 运行中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值