Java多线程

Java多线程

主线程:当Java程序启动时,一个线程会自动创建并立刻运行,该线程通常叫做程序的主线程(main thread)。主线程的优先级默认为5。程序进程中,由它产生其他线程,这些子线程的优先级继承自主线程。

  1. 线程创建的两种方式:
  • 自定义类继承Thread类并重写其run()方法,其他任意类中默认构造自定义类对象即创建用户进程。

    • 并发运行:调用用户线程类的start()方法,再显式调用重写的run()方法(本质为主线程调用该线程对象的run()方法)。
  • 自定义类实现Runnable接口并实现run()方法,再在任意其他类中实例该自定义类对象后,Thread类使用带参的构造函数(参数为自定义类对象)实例一个对象即创建了用户线程。

    • 并发运行:用户进程调用start()方法即可,run()方法在创建进程对象时会自动调用。

    Runnable对应要完成的任务,Thread对应任务执行者。二者到底使用那个实现多线程要自己取舍。

  1. 线程的生命周期:

    • 新建状态(New)

    • 就绪状态(Runnale):进入就绪态的线程都位于运行池中,因为Java不区分就绪态和运行态。

    • 阻塞状态(Blacked)
      包含

      • sleep(milliseconds)方法进入的休眠状态、
      • wait()方法进入的挂起状态,该状态得到notify()或notifyAll()消息才能重新进入就绪状态、
      • 等待某个输入/输出完成、
      • 同步锁的一个状态。
    • 死亡状态(Dead)

  2. 线程调度
    JVM采用的是抢占式调度模型。
    线程抢占的四种方法:

    • 调整线程优先级:Thread类的setPriority(int)方法
    • 线程让步:运行的线程调用yield()方法,只对同级或更高的其他线程生效,因为调用后该线程仍处于就绪态。
    • 线程休眠:运行的线程调用sleep()方法,该方法不考虑线程优先级,因为线程调用后在休眠时间内属于阻塞状态。
    • 合并线程:运行的线程调用其他线程的join()方法,调用后该线程被挂起(wait()方法进入的阻塞状态),直到目标线程执行结束才恢复运行。若添加了超时参数,则超时就返回。
  3. 后台线程

    又称守护进程。作用:为其他线程提供服务的进程。JVM的立即回收线程就是一个典型的后台线程。主线程默认是前台线程,前台线程创建的线程默认也是前台线程。

    • setDaemon(true)方法设置线程为守护进程
    • isDaemon()方法判断是否为守护进程
  4. 线程互斥

    • 共享变量和临界区:

      共享变量:多个线程共享的数据区

      临界区:对共享变量进行读/写操作的程序段

    • 线程互斥:

      多个线程要进入临界区操作,一个线程进入进行操作时,保证其他线程无法进入。

    • 如何实现:

      将对程序段中共享变量的操作(即临界区操作)变为原子操作(该操作是由一条命令组成)。Java中使用“对象锁“机制实现

    • “对象锁”机制实现:

      • synchronized关键字
      • 显式的Lock对象
  5. 线程同步

    与线程互斥相反。线程之间相互协作来共同完成一些任务,就是线程同步。

    实现:

    • join()方法

      Thread类的方法

    • wait()、notify()和notifyAll()方法组合

      java.lang.Object类方法

posted @ 2020-10-22 16:49  Jancy丶  阅读(137)  评论(0)    收藏  举报