JavaEE-23、24--Java中的多线程

1.要想了解多线程,必须先了解线程,而要想了解线程,必须先了解进程,因为线程是依赖于进程而存在。

  多线程 -- > 线程 --> 进程

2.什么是进程?

  通过任务管理器我们就看到了进程的存在。

  而通过观察,我们发现只有运行的程序才会出现进程。

  进程:就是正在运行的程序,是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源。

3.多进程有什么意义?

  单进程的计算机一次只能做一件事情,而我们现在的计算机都可以同时做多件事情

  也就是现在的计算机都是支持多进程的,都可以在一个时间段内执行多个任务。

  并且,可以提高CPU的使用率。(虽然单核CPU在某一个时间点上只能做一件事情,但CPU可以高效的切换各程式之间的运行,切换的间隔时间非常短,以致我们感觉不出来)

4.什么是线程?

  在一个进程内又可以执行多个任务,而每一个任务我就可以看成是一个线程。

  线程: 是进程中的单个顺序控制流,是一条执行路径。(是程序使用CPU的最基本单位)

  单线程:如果程序只有一条执行路径。

  多线程:如果程序有多条执行路径。

5.多线程有什么意义呢?

  多线程的存在,不是提高程序的执行速度,其实是为了提高应用程序的使用率

  程序的执行其实都是在抢CPU的资源(CPU的执行权)。

  多个进程是在抢这个资源的时候,其中某一个进程如果执行路径比较多,就会有更高的几率抢到CPU的执行权。

  我们不敢保证哪一个线程能在哪一个时刻抢到,所以线程的执行有随机性。

6.Java程序运行原理

  java命令会启动java虚拟机(JVM),等于启动了一个应用程序,也就是启动了一个进程。

  该进程会自动启动一个“主线程”,然后主线程去调用某个类的Main方法。

  所以,main方法运行在主线程中,在此之前的所有程序都是单线程的。

  思考:JVM虚拟机的启动是单线程还是多线程?

      JVM虚拟机的启动首先会有一个主线程,除此之外,垃圾回收线程也需要启动,否则很容易就会出现内存溢出。

      因此,至少启动了两个线程,属于多线程。

 7.多线程的实现方案

  方案一:继承Thread类

    A.自定义类MyThread继承Thread类

    B.在MyThread类中重写run()

    C.创建MyThread类的对象

    D.启动线程对象

  方案二:实现Runnable接口

    A.自定义类MyRunnable实现Runnable接口

    B.在MyRunnable类中重写run()  -----注意:这里不能直接调用getName()方法,需要间接调用

    C.创建MyRunnable类的对象

    D.创建Thread类的对象,并把C步骤的对象作为构造参数传递

8.线程的调度和优先级问题

  A.线程的调度

    a.分时调度

    b.抢占式调度(Java采用的是该方式)

  B.获取和设置线程优先线

    a.默认优先级是5

    b.优先级范围是1-10

9.线程的控制

  A.休眠线程  public static void sleep()  ---静态方法,在类定义的时候已经被装载和分配

  B.加入线程  public final void join()    ---非静态方法,在类被实例化成对象,对象调用该方法时才分配内存

  C.礼让线程  public static void yield()  ---静态方法,在类定义的时候已经被装载和分配

  D.后台线程  public final void setDaemon(boolean on)  ---非静态方法,在类被实例化成对象,对象调用该方法时才分配内存

  E.终止线程  public void interrupt()  ---非静态方法,在类被实例化成对象,对象调用该方法时才分配内存

10.线程的生命周期

  A.新建(New):创建Thread对象,然后调用Start()方法,线程变为就绪(可执行)状态

  B.就绪(Runnable):有执行资格,但没有执行权

  C.运行(Running):线程获得CPU执行权后,进入运行状态并自动调用run()方法

  D.阻塞(Block):执行中的线程遇到wait()方法或者sleep()方法时,会进入阻塞状态

  E.死亡(Dead):当run()方法运行完,或者被强制终止,或者发生Error或Exception时,线程会进入死亡状态,等待被回收

  wait()和sleep()的区别:

    wait():线程遇到此方法,会被放入wait pool中等待,直到有notify将它唤醒,或者interrupt将它打断,然后开始等待对象锁,获得对象锁后重新进入就绪状态

        wait()和notify()方法只能在同步控制方法或同步控制块里使用。

    sleep():线程遇到此方法,会进入阻塞状态,直到sleep时间达到后继续执行,但不会释放对象锁

        sleep()可以在任何地方使用。

  

 

posted @ 2021-03-09 20:56  benon  阅读(77)  评论(0编辑  收藏  举报