天天看点

java多线程基础篇---基础java并发基础

文章目录

  • java并发基础
    • 线程基础
      • 预备知识
      • Java基础知识
    • 转载申明

java并发基础

随着摩尔定律的失效,程序的运行的速度已经越来越依赖于程序设计的合理性。在一些特定的场合下,多线程能大大提高程序的速度。

线程基础

预备知识

  • 在起初计算机的线程是与CPU核心数相等的,2002年发布超线程技术后,计算机的线程就能与核心数成1:2的关系。比如i7 8700k 就是采用4核8线程。
  • 现在的操作系统大多是多线程的, 虽然我们感觉不到线程在运行,但往往同时运行的线程数会超过CPU的实际线程数。这时候就会使用时间片轮转(RR)调度,既一个CPU实际的线程按时段分为多份,运行大于实际线程的任务。因为切换的时间很短,所以几乎感觉不出差别。
  • 线程切换会涉及到一些线程信息的处理,这一过程是消耗时间的,所以当虚拟线程远大于实际线程的时候,切换时间片所消耗的时间,可能会大于实际线程运行的时间。
  • 原子性操作,就是指操作粒度最小的操作,比如“a+b”这个操作就不是原子操作。它的实际操作步骤是1.取a的值,2.取b的值,3.计算a+b的值。当我们任意一步执行时,都可能会遇到上述所说的时间片切换。比如执行完成操作1时,时间片进行切换,切换的时间片修改了b的值,那么等再次切换到"a+b"这个时间片时,获得的就不是预期值了。打个比方如果"a+b"这个操作是原子操作,那么只有两种可能,1.a+b执行且执行完 2.a+b没执行 。因为这个操作是一个整体。

Java基础知识

java中的创建线程,是通过协作的方式进行管理的

  1. 创建线程的三种方式
  • 继承Thread 重写 run()方法
  • 实现接口 Runnable 实现 run()方法
  • 实现接口 Callable 实现 call()方法,Callable可以有返回值,Runnable没有返回值
  1. stop(),resume(),suspend()

    java多线程的设计初衷是协作式,所以现在已经不建议使用。stop()会导致线程不会正确释放资源,suspend()容易导致死锁。这些都是强制关闭或暂停的手段。

  2. interrupt(),isInterrupted(),Thread.Interrupted()

    调用interrupt(),会将线程内的标识位制位true这是需要程序员手动通过isInterrupted()方法或者静态方法Thread.Interrupted()去判断标识位是否为true 从而停止线程执行。

    Thread.Interrupted()会在判断完成后默认将状态标识制为false。

    我们也可以自己写一个标识变量,完成线程的停止。值得一提的是,我们自己写的标识,无法将线程从等待状态立马唤醒,也就是说如果有Thread.Sleep(),那么我们自己写的标识判断必须等到sleep结束后才能执行。

  3. yield()

    让正在执行的线程,让出当前时间片的执行权,重新竞争时间片。所以下个时间片任然有可能会执行该线程。

  4. priority

    设置线程优先级,取值范围是[1,10],缺省值为5。但线程的优先级不可靠,由操作系统控制,不建议作为线程开发时候的手段。

  5. daemon

    设置守护线程,守护线程与主线程同时结束,如果如主线程结束时,守护线程正在执行,则停止守护线程。这种停止是不会触发finally()的

  6. join

    线程A,执行了线程B的join方法,线程A必须要等待B执行完成了以后,线程A才能继续自己的工作。

转载申明

  1. 博客中标注原创的文章,版权归原作者 kkgggkg 所有;
  2. 未经原作者允许不得转载本文内容,否则将视为侵权;
  3. 转载或者引用本文内容请注明来源及原作者;
  4. 对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。