多线程系列六:线程礼让与强制执行(代码示例+用栗子比较)

在学习Java的道路上,是否路过多线程时总让你很迷惘;很不巧,我也是,而使我们感到很迷惘主要原因都源于没有对概念的深深的理解和实践。所以我决定漫步Java多线程,同你一起会会多线程。

多线程系列

多线程系列一:理解多线程在于深深地理解了多任务、进程、多线程、线程
多线程系列二:手撕多线程,从会三种创建多线程方式开始:除了常见的两种,你是否了解Callable接口方式?
多线程系列三:初遇并发问题:从一个小故事开始,从一行行代码开始**
多线程系列四:停止多线程,你不会还以为是用stop和destroy吧?
多线程系列五:多线程为何要使用休眠?
多线程系列六:线程礼让与强制执行
多线程系列七:纯手绘图解多线程状态+代码示例,就问你怕了吗?

yield线程礼让

yield 用于暂停当前正在执行的线程,让其他线程执行。

但是不一定有效果

因为让出后,让步的线程可能再次被CPU调度分给这个线程。

先来看没有使用yield,都是按顺序执行。

public class ThreadDemo implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"===正在执行");
        System.out.println(Thread.currentThread().getName()+"===停止");
    }

    public static void main(String[] args) throws InterruptedException {
        ThreadDemo thread = new ThreadDemo();
        new Thread(thread,"小蓝").start();
        new Thread(thread,"一颗剽悍的种子").start();
    }
}

运行结果
在这里插入图片描述

使用 yield 之后,并不会按照顺序执行,而是会出现线程礼让的情况

但是 但是 可以看到运行多次后时有时无

所以 yield 有什么更具体的使用呢???

还是要到业务当中,如果你有某一个线程不太重要,优先级也很低,但是他可能占用CPU很多资源,那么可以使用 yield 礼让给其他重要的线程机会。

public class ThreadDemo implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"===正在执行");
        Thread.yield();
        System.out.println(Thread.currentThread().getName()+"===停止");
    }

    public static void main(String[] args) throws InterruptedException {
        ThreadDemo thread = new ThreadDemo();
        new Thread(thread,"小蓝").start();
        new Thread(thread,"一颗剽悍的种子").start();
    }
}

运行结果
在这里插入图片描述
在这里插入图片描述
join强制执行

join主要用于阻塞其他线程,待此线程执行完后,再执行其他线程。

先来看,没有使用join的代码示例

通过使用join和没有使用join比较才能更好的学习。

public class ThreadDemo implements Runnable{

    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println("一颗剽悍的种子==="+i);
        }
    }
    public static void main(String[] args) throws InterruptedException {
        ThreadDemo thread = new ThreadDemo();
        Thread threadJoin = new Thread(thread);
        threadJoin.start();
        for (int i = 1; i <= 10; i++) {
            System.out.println("小蓝==="+i);
        }
    }
}

运行结果
在这里插入图片描述
使用了 join

public class ThreadDemo implements Runnable{

    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println("一颗剽悍的种子==="+i);
        }
    }
    public static void main(String[] args) throws InterruptedException {
        ThreadDemo thread = new ThreadDemo();
        Thread threadJoin = new Thread(thread);
        threadJoin.start();
        for (int i = 1; i <= 10; i++) {
            if (i == 5){
                threadJoin.join();
            }
            System.out.println("小蓝==="+i);
        }
    }
}

运行结果
在这里插入图片描述
最后:

为了更好的阅读体验,我把想说的话都放在了下面,嘿嘿。

我是一颗剽悍的种子 把我会的,认真的分享 是我写博客一直不变的信条。
如果你能看到这篇博文,说明咱们还是很有缘的;希望能带给你一些许帮助,创作的不易,
把我文章的知识带走,你的三连留下,点赞,评论,关注,是我最大的动力。

猜你喜欢

转载自blog.csdn.net/A_hxy/article/details/107925696