【三】多线程

1.Thread

  • extends Thread

2.Runnable

  • implements Runnable

3.两者初步理解

  • 任务管理器中设置相关性(为于演示理解)
    • 选一个cpu(运行多线程要在一个CPU上运行)
  • Java语言中只能继承一个类,所以Thread单根继承,但如果继承了它 应用就不好继承其它类了
  • Java可以实现多个接口,所以一般场景多选择实现Runnable。
  • 启动一个线程一定要调用它的start方法,而不能调用它的run方法。
  • 一个线程对象不可以start(启动)两次

4.线程生命周期

  • 正常曲线:新建→就绪→运行→死亡
  • 非正常:运行→堵塞→就绪→运行

5.抢占式(多)、设置优先级、后台线程学习

  • 抢占式学习、设置优先级
    (在线程启动前设定)
    • wq4.setPriority(Thread.MAX_PRIORITY);//设置最高优先级
    • wq1.setPriority(Thread.MIN_PRIORITY);//最低
  • 设置为后台线程
    • wq1.setDaemon(true);
  • 为线程设置名称
    • wq.setName("b");

6.线程让步

  • yield()
    • 要想线程让步:(必须满足下面两个条件)
      • 1.存在另外的线程优先级大于等于我
      • 2.另外的线程处于就绪状态

7.参与

  • join()
    • join线程 让其他进程参与 自己处于堵塞状态 直到其他结束再执行

8.线程同步

  • synchronized
    • public synchronized void run() {}//1.同步方法
    • synchronized (this){}//2.同步代码块
  • 释放锁(持有锁的线程在以下情况会释放锁:)
    • 1.执行完同步代码块
    • 2.执行同步代码块的过程中,遇到异常而导致线程终止
    • 3.在执行同步代码块的过程中,执行了锁所属对象的wait()方法
    • ★执行sleep()和yield()都不会释放锁

9.线程通信

代码

  • wait()
    • 执行该方法的线程释放对象的锁,Java虚拟机把该线程放到该对象的等待池中。该线程将等待其他线程将其唤醒。
  • notify()
    • 执行该方法的线程唤醒在对象的等待池中等待的一个线程。Java虚拟机从对象等待池中随机选择一个线程,把它转到对象的锁池中。
  • notifyAll()
    • Object类还有一个notifyAll()方法,该方法将会唤醒所有在这个对象锁池中的所有线程。

10.生产者消费者案例

  • Container(容器)
    • 主要包含push(生产)、pop(消费)方法。
  • Producer(生产者)
  • Consumer(消费者)

你可能感兴趣的:(【三】多线程)