天天看点

java进阶07 线程的让步与阻塞与同步

  前面介绍了线程的一些基本知识,现在来说下线程的让步,阻塞,和同步

  先说说让步

  所谓让步,就是让调用者的线程暂停,让其他线程重新竞争cpu,包括调用者。

  先看看代码

  

  我们来分析下该代码

  代码中的thread.yield()就是让步的函数,这里循环30次 当i为5的倍数的时候 让步 同时打出 重新竞争cpu的字段

  那我们期待的结果就是这样的形式:

  线程1正在执行1

  线程1正在执行2

  线程1正在执行3

  线程1正在执行4

  线程1正在执行5

  重新竞争cpu

  线程1正在执行6

  线程1正在执行7

  线程1正在执行8

  线程1正在执行9

  线程1正在执行10

  那我们来看看真正打出结果:

  线程2正在执行1

  线程2正在执行2

  线程2正在执行3

  线程2正在执行4

  线程2正在执行5

  线程2正在执行6

  线程2正在执行7

  线程2正在执行8

  线程2正在执行9

  这可跟我们期待的值差太多了。

  这是什么原因呢? 还是由于cpu的分配的问题,cpu分配是随机的,什么时候当前线程被其他线程抢去也不奇怪。

  还有可能出现这种结果:

  这就是当程序i=5的倍数时,运行完system.out.println(thread.currentthread().getname()+"正在执行"+i);

  该线程就被挤出去了,导致 for里面都只运行了一半.

  而为了处理这种情况,提供了一种叫同步的东西:

  所谓线程同步,就是在一段程序执行的过程中,无论成功还是失败,其他线程都会等待这段程序的执行完毕,才会转入其他线程

  这样可以保证程序的完整性和安全性。

  java里用synchronsized关键值实现

  它既可以修饰代码块,又可以修饰函数。

  输出结果:

  这就达到了我们想要的结果。

  最后讲到的就是线程的阻塞。

  调用thread.join()会 阻塞当前线程,直至调用者的线程执行完毕之后,才执行其他线程,相当于将cpu全部分给调用者的线程。从而达到控制线程的先后顺序

  输出结果:

  线程1正在执行9998

  线程1正在执行9999

  主线程正在执行

  可以看出新开的线程和主线程不会出现互相交替出现的时候了,因为新开线程阻塞了主线程,只有等到该线程全部执行完毕的时候,才会执行主线程

  关于线程的东西就先说到这里了。

上一篇: bat 栈上限
下一篇: js prototype