Java并发中的sleep、yield、join、stop方法

一、sleep方法

        1.调用 sleep 会让当前线程从 Running 进入TIMED_WAITING状态,但是不会释放对象锁

        2.其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出InterruptedException,并且会清除中断标志 ,此时要在finally代码块中重新设置中断标志位hread.currentThread().interrupt();

        3.sleep当传入参数为0时,和yield一样可以释放时间片,让进程进入Runnable状态。

二、yield方法

        yield会释放CPU资源,让当前线程从 Running 进入 Runnable状态,让优先级更高(或者相同)的线程获得执行机会,但是不会释放对象锁。 比如ThreadA调用yiled方法后,他会优先执行。

三、join方法

        等待调用join方法的线程结束之后,程序再继续执行。

比如如下代码:

package com.spj.peng;

public class ThreanJoinTest {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(new Runnable() {
            public void run() {
                System.out.println("t begin");
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("t finished");
            }
        });
        long start = System.currentTimeMillis();
        t.start();
        //主线程等待线程t执行完成
        //t.join();
        System.out.println("执行时间:" + (System.currentTimeMillis() - start));
        System.out.println("Main finished");
    }
}

假如没有join方法主线程不会等待t线程先执行完,而是先执行自己的。

而若加入join方法后主线程会先等待t线程执行完在执行

四、stop方法

        stop()方法会释放对象锁强行把执行到一半的线程终止。比如A线程执行到一半的时候调用stop()方法的话,则会将该线程强行终止并且释放锁,让其他线程执行,这样问题就来了,A线程

剩下的一半业务还没执行完,若该业务很主要,则会出现很严重的问题。

        因此一般终止线程的时候,都尽量用interrupt来终止线程:通过interrupt中断机制不会直接终止另一个线程,而需要被中断的线程自己处理。中断的线程拥有完全的自主权,它既可以选择立即停止,也可以选择一段时间后停止,也可以选择不停止。这样就可以保证线程安全。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鹏之翼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值