最近学到了多线程,进度刚好到线程的常用方法这个地方,我自己找的教学里面也教了这些方法使用和特点,基本也算都掌握了。
然后在使用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,它本身的目的就不希望我们能够在线程里去控制另一个线程