学习目标

  • 多线程
    • 线程安全
    • 线程死锁
    • 线程状态
    • 线程通信
    • 线程池

      1. 多线程

      1.1 多线程能解决什么问题 ?

      使用多线程就是在正确的场景下通过设置正确个数的线程来最大化程序的运行速度。

      1.2 解决线程安全问题的方式有哪些 ?

  1. 同步代码块(使用synchronized关键字)。

    1. 同步方法:就是把synchronized关键字加到方法上
  2. Lock锁机制(使用Lock接口下的实现类)。

  3. 使用线程本地存储ThreadLocal。
  4. 方法四:使用乐观锁机制。

tongbu.png

1.3 线程池存在的优势 ?

  • 降低资源消耗。减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
  • 提高响应速度。当任务到达时,任务可以不需要等待线程创建﹐就能立即执行。
  • 提高线程的可管理性。可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的

    1. 内存﹐服务器死机(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

    1.4 线程池能处理什么任务

  1. 线程池处理Runnable任务:多线程任务类型,首先自然想到的就是实现 Runnable 接口的类,Runnable接口提供了一个抽象方法run,这个方法无参数,无返回值。
  2. 线程池处理Callable任务:与 Runnable 类似, Callable 也只有一个抽象方法,不过该抽象方法有返回值。在实现该接口的时候需要制定返回值的类型。

    1.5 线程有几种实现方式 ?

  3. 继承Thread类

  • 基本步骤:
    • 创建一个类继承Thread类;
    • 在类中重写run方法(线程执行的任务放在这里);
    • 创建线程对象,调用线程的start方法开启线程;
    • 执行程序,观察控制台的打印数据的现象。
  1. 实现Runnable接口
  • 基本步骤:
    • 定义任务类实现Runnable,并重写run方法 ;
    • 创建任务对象;
    • 使用含有Runnable参数的构造方法,创建线程对象并指定任务;
    • 调用线程的start方法,开启线程。 | | 优点 | 缺点 | | —- | —- | —- | | 实现Runnable | 扩展性强,实现该接口的同时还可以继承其他的类。 | 编程相对复杂,不能直接使用Thread类中的方法 | | 继承Thread | 编程比较简单,可以直接使用Thread类中的方法 | 可扩展性较差,
      不能再继承其他的类 |
  1. 实现Callable接口(需要利用线程池)。

    1.6 线程间的通信能解决什么问题 ?

    1)等待方法
    void wait() 让线程进入无限等待。
    void wait(long timeout) 让线程进入计时等待 。
    以上两个方法调用会导致当前线程释放掉锁资源。
    2)唤醒方法
    void notify() 随机唤醒在此对象监视器(锁对象)上等待的单个线程。
    void notifyAll() 唤醒在此对象监视器上等待的所有线程。
    以上两个方法调用不会导致当前线程释放掉锁资源。
    注意:
  • 等待的方法会释放锁,唤醒的方法不会释放锁。
  • 等待和唤醒的方法,都要使用锁对象调用(需要在同步代码块中使用)。
  • 等待和唤醒方法应该使用相同的锁对象调用。
  • 因为等待和唤醒的方法都属于Object类的方法,所有任意对象都可以调用,但此对象必须作为锁对象。

    1.7 线程状态

    image.png

    2. 当日问题小结

    2.1 当日遇到的问题

    2.2 出现问题原因

    2.3 解决问题方案