JAVA多线程基础

多线程中join、yield、wait、sleep的区别

  • Thread类的方法:sleep(),yield()等
  • Object的方法:wait()和notify()等

由于sleep()方法是Thread 类的方法,因此它不能改变对象的机锁。所以当在一个Synchronized方法中调用sleep()时,线程虽然休眠了,但是对象的机锁没有被释放,其他线程仍然无法访问这个对象。而wait()方法则会在线程休眠的同时释放掉机锁,其他线程可以访问该对象。
Yield()方法是停止当前线程,让同等优先权的线程运行。如果没有同等优先权的线程,那么Yield() 方法将不会起作用。

一个线程结束的标志是:run()方法结束。
一个机锁被释放的标志是:synchronized块或方法结束。


1.wait()方法(会释放锁,让其他线程有机会获得它之前所占用的锁)
在其他线程调用对象的notify或notifyAll方法(唤醒所有等待的对象)前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。
当前线程必须拥有当前对象锁。wait,notify和notifyAll方法都必须放在synchronized 代码块中,否则就会报java.lang.IllegalMonitorStateException。
唤醒当前对象锁的等待线程使用notify或notifyAll方法,也必须拥有相同的对象锁。waite()和notify()必须在synchronized函数或synchronized block中进行调用。

Wait()方法和notify()方法:当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去了对象的机锁。当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中。该线程从锁池中获得机锁,然后回到wait()前的中断现场。

2.join方法(底层用了wait方法)
等待该线程终止。
等待调用join方法的线程结束,再继续执行。
如果B线程里调用了A.join(),A还没返回,调用B.interrupt()B会被中断,并报InterruptedException

3、sleep()方法(线程虽然休眠了,但是对象的机锁没有被释放,其他线程仍然无法访问这个对象)
在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。
sleep()使当前线程进入阻塞状态,在指定时间内不会执行。

4.yield()方法(跟sleep类似,但是它的时间是随机的)
暂停当前正在执行的线程对象。yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。yield()只能使同优先级或更高优先级的线程有执行的机会。调用yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,这一点是和sleep方法不一样的。

参考;https://www.jianshu.com/p/68af3b17a04e

https://segmentfault.com/a/1190000021875753

5.

ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量。
链接:https://www.jianshu.com/p/74f1a883da50

因为在子线程中,是没有threadLocal的。如果我们希望子线可以看到父线程的ThreadLocal,那么就可以使用InheritableThreadLocal。顾名思义,这就是一个支持线程间父子继承的ThreadLocal,将上述代码中的threadLocal使用InheritableThreadLocal:

InheritableThreadLocal threadLocal = new InheritableThreadLocal();


链接:https://juejin.cn/post/6959333602748268575

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值