多线程基础(主要内容转载于https://segmentfault.com/a/1190000014428190)

  • 进程作为资源分配的基本单位
  • 线程作为资源调度的基本单位,是程序的执行单元,执行路径(单线程:一条执行路径,多线程:多条执行路径)。是程序使用CPU的最基本单位。
  • 线程有3个基本状态

    • 执行、就绪、阻塞(还有新生,死亡)

    线程有5种基本操作

    • 派生、阻塞、激活、 调度、 结束
    • 线程有两个基本类型

      • 1) 用户级线程:管理过程全部由用户程序完成,操作系统内核心只对进程进行管理。
      • 2) 系统级线程(核心级线程):由操作系统内核进行管理。操作系统内核给应用程序提供相应的系统调用和应用程序接口API,以使用户程序可以创建、执行以及撤消线程。
      • 注意:当用户级线程都结束时,jvm虚拟机就会结束,不管保护线程是否还在运行;
      • 线程的属性:

        • 1)轻型实体;
        • 2)独立调度和分派的基本单位;
        • 3)可并发执行;
        • 4)共享进程资源
        • 值得注意的是:多线程的存在,不是提高程序的执行速度。其实是为了提高应用程序的使用率,程序的执行其实都是在抢CPU的资源,CPU的执行权。多个进程是在抢这个资源,而其中的某一个进程如果执行路径比较多,就会有更高的几率抢到CPU的执行权(注意:有阻塞的出现,才会使用多线程,即在一个线程发生阻塞时,其他线程可以继续使用CPU)
        • 通过上面的顶部注释我们就可以发现,创建多线程有两种方法:

          • 继承Thread,重写run方法
          • 实现Runnable接口,重写run方法
          • Java实现多线程需要注意的细节

            不要将run()start()搞混了~

            run()和start()方法区别:

            • run():仅仅是封装被线程执行的代码,直接调用是普通方法
            • start():首先启动了线程,然后再由jvm去调用该线程的run()方法。

            jvm虚拟机的启动是单线程的还是多线程的?

            • 是多线程的。不仅仅是启动main线程,还至少会启动垃圾回收线程的,不然谁帮你回收不用的内存~

            那么,既然有两种方式实现多线程,我们使用哪一种???

            一般我们使用实现Runnable接口

            • 可以避免java中的单继承的限制
            • 应该将并发运行任务和运行机制解耦,因此我们选择实现Runnable接口这种方式!
原文地址:https://www.cnblogs.com/serendipity-fly/p/9358394.html