Java多线程之sleep、yield、join

进程是系统分配资源的基本单位,而线程是执行的基本单位,线程间共享进程的地址空间。线程切换比进程切换更快,创建线程可以通过继承Thread、实现Runnable或Callable接口等方式。sleep使线程暂停指定时间,不释放锁;yield让当前线程回到可运行状态,不一定让其他线程运行;join确保线程按顺序执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程和进程的区别?

进程是系统进行资源分配和调度的一个独立单位。最小执行单元是线程。

线程是进程的一个实体,一个进程中拥有多个线程,线程之间共享地址空间和其他资源。

线程上线文的切换比进程上下文切换要快很多。

进程切换时,涉及到当前进程CPU环境的保存和新被调度运行进程的CPU环境的设置。

线程切换仅需要保存和设置少量的寄存器内容,不涉及存储管理方面的操作。

创建线程的方式:

        继承Thread类,重写run方法;

        实现Runnable接口;

        实现Callable接口;

        通过线程池启动线程;

        lamda表达式直接new Thread(() -> {//业务逻辑}).start();

sleep:使当前正在执行的线程以指定的毫秒数暂停,具体取决于系统定时器和调度程序的精度和准确性。会使线程变为TimedWaiting状态,不会释放锁,当线程结束睡眠时,会变为就绪状态,等待运行。

yield:暂停当前正在运行的线程(及放弃当前拥有的cpu资源),并执行其他线程。yield()做的是让当前运行线程回到可运行状态,以达到允许具有相同优先级的其他线程获得运行机会。目的,让相同优先级的线程能适当的轮转执行。但,实际无法保证yield()让步目的,因为让步的线程还有可能被调度程序选中运行。

yield()并没有使线程进入到“等待、睡眠、阻塞”状态,在大多数情况下,只是将状态由“运行”转为“可运行”,但有可能没有效果,即又被调度程序选中运行。

join:保证线程执行的顺序,当前线程调用t.join()方法后,其他线程进入等待,直到当前线程执行完,其他线程才可以继续执行。底层是通过wait和notify实现的。

public class ThreadDemo implements Runnable{

    public static void main(String[] args){
        try {
            Thread t1 = new Thread(new ThreadDemo(),"Thread 1");
            Thread t2 = new Thread(new ThreadDemo(),"Thread 2");
            Thread t3 = new Thread(new ThreadDemo(),"Thread 3");
            t1.start();
            t1.join();
            t2.start();
            t2.join();
            t3.start();
            t3.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}

输出结果:

Thread 1
Thread 2
Thread 3 

底层代码:

 

扩展问题:

1.在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐完毕,放下筷子又继续思考。

2.多线程交叉输出。

3.ABC三个任务同时进行,如果有一个任务被取消或出现问题,则全部结束,要求高效完成。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈年小趴菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值