Java多线程常用方法sleep()和join的个人理解

最近学到了多线程,进度刚好到线程的常用方法这个地方,我自己找的教学里面也教了这些方法使用和特点,基本也算都掌握了。

然后在使用sleep(),join()过程中,发现了几个老师没讲到的情况,自己理解了一下

首先join()是用来切换线程的,比如我们有两个线程a和b,我们如果a线程执行过程中他有数据需要b线程来提供这个时候我们就需要使用join来切换到b线程,这个时候a线程会陷入阻塞状态,

他会等b线程执行完了,再解除阻塞状态,重新执行a线程,在这个b线程结束前,a线程都不会执行

具体代码

 运行结果:

 可以看到当线程1里面的循环变量i==5的时候,调用了线程2的join方法()这个时候线程1就陷入了阻塞状态,不再执行了,切换到了线程2执行,等线程2执行完了后才重新开始执行了,这里需要提醒的是在i==5之前可能线程1和线程2同时混合着执行。只有到i==5之后,线程1才会不再执行到线程2结束。

然后我又运行了一遍

 发现了一种特殊的情况,那就是i==5后面并没有像我想象的后面全是线程2,而在老师的讲解过程也只说过第一种情况,正当我以为怀疑是不是自己写错了代码时,我突然想起我学的好像是多线程,在多核cpu的情况下,他们两个线程是并行的关系,

有没有可能是在线程1还没执行到i==5的前面,线程2就执行完毕了,结果当i==5的时候,线程2已经死亡结束了,所以就没有陷入阻塞状态他的作用应该是假设当线程1需要线程2的数据的时候,拦住线程1,放走线程2获取数据。如果线程2已经提前执行,数据也有了,也就没有必要再去拦住线程1了

然后就是sleep()方法

sleep(long milltime)是用来让线程进入休眠状态

当线程执行到这个方法的时候,会根据你设定的值将线程“休眠” 时间到了就“苏醒”过来再次执行

可以用来降低线程运行的速度,我们可以在线程执行到某个条件的时候让他变慢

 同样我在使用的过程也发现了,通过线程对象调用sleep方法()时候,他影响的是sleep的所在的线程和用谁的对象调用无关,比如上面这个图片他是线程2,如果我在sleep()前面通过线程1的对象去调用sleep()方法,执行变慢的,仍然是线程2,大概是因为sleep他是个静态方法,线程类都共享有这个方法,当我们在线程2种调用线程1的sleep()实际还是影响的线程1,所以我们在实际过程中还是使用类名的方式去调用静态方法,也就是Thread.sleep() 。或许将这个方法定义为static,它本身的目的就不希望我们能够在线程里去控制另一个线程

  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值