Java-多线程

多线程
  • 实现多线程
    • 进程
      • 是正运行的程序
      • 是系统进行资源分配和调用的独立单位
      • 每一个进程都有它自己的内存空间和系统资源
    • 线程
      • 定义
        • 是进程中的单个顺序控制流,是一条执行路径
      • 单线程
        • 一个进程如果只有一条执行路径,则称为单线程程序
        • 举例:记事本程序,要么进行输入操作,要么进行页面设置
      • 多线程
        • 一个进程如果有多条执行路径,则称为多线程程序
        • 举例:扫雷程序,计时和进行扫雷是独立进行的
    • 多线程实现
      • 继承Thread类
        • 1、定义一个MyThread类 extends Thread类
        • 2、在MyThread类重写run()方法
        • 3、创建MyThread类的对象,MyThread my = new MyThread()
        • 4、启动线程, my.start()
        • 注意
          • 重写run()方法
            • run()是用来封装被线程执行的代码
          • run()和start()的区别
            • run()方法,直接调用,相当于普通方法的调用
            • start()启动线程,然后由JVM调用线程的run()方法
      • 实现Runnable接口
        • 1、定义一个类MyRunnable实现Runnable接口
        • 2、在MyRunnable类中重写run()方法
        • 3、创建MyRunnable类的对象
        • 4、创建Thread类的对象,把MyRunnable对象作为构造方法的参数
        • 4、启动线程
        • 与继承Thread相比的好处
          • 避免了Java单继承的局限性
          • 适合多个相同程序的代码去处理同一个资源的情况,把线程和程序的代码、数据有效分离,较好的体现了面向对象的设计思想
    • 设置和获取线程名称
      • void setName(String name) 将线程名设置为参数name
      • String getName() 返回此线程的名称
      • 通过构造方法也可以设置线程名称
      • 获取main()方法的线程名称
        • public static Thread currentThread()
    • 线程调度
      • 两种模型
        • 分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片
        • 抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些
        • Java使用的是抢占式调度模型
      • 获取和设置优先级
        • public final int getPriority() -- 获取优先级
        • public final void setPriority(int newPriority) -- 更改优先级
        • 优先级范围
          • 默认
            • 5
          • MINPRIORITY
            • 1
          • MAXPRIORITY
            • 10
        • 注意
          • 线程优先级高仅仅代表线程获取CPU时间片的几率高
    • 线程控制
      • static void sleep​(long millis)
        • 使当前正在执行的线程停留(暂停执行)指定的毫秒数
      • void join​()
        • 等待这个线程死亡
      • void setDaemon​(boolean on)
        • 将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出
    • 线程生命周期
  • 线程同步
    • 同步代码块
      • 格式
        • synchronized(任意对象) { 多条语句操作共享数据的代码 }
      • synchronized(任意对象):就相当于给代码加锁了,任意对象就可以看成是一把锁
      • 好处
        • 解决了多线程的数据安全问题
      • 弊端
        • 当线程很多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率
    • 同步方法
      • 同步方法
        • 格式
          • 修饰符 synchronized 返回值类型 方法名(方法参数) { }
        • 锁对象
          • this
      • 同步静态方法
        • 格式
          • 修饰符 static synchronized 返回值类型 方法名(方法参数) { }
        • 锁对象
          • 类名.class
    • 线程安全的类
      • StringBuffer
        • 线程安全,可变的字符序列
        • 从版本JDK 5开始,被StringBuilder 替代。 通常应该使用StringBuilder类,因为它支持所有相同的操作,但它更快,因为它不执行同步
      • Vector
        • 从Java 2平台v1.2开始,该类改进了List接口,使其成为Java Collections Framework的成员。 与新的集合实现不同, Vector被同步。 如果不需要线程安全的实现,建议使用ArrayList代替Vector
      • Hashtable
        • 该类实现了一个哈希表,它将键映射到值。 任何非null对象都可以用作键或者值
        • 从Java 2平台v1.2开始,该类进行了改进,实现了Map接口,使其成为Java Collections Framework的成员。 与新的集合实现不同, Hashtable被同步。 如果不需要线程安全的实现,建议使用HashMap代替Hashtable
    • Lock锁
      • Lock中提供了获得锁和释放锁的方法
        • void lock():获得锁
        • void unlock():释放锁
      • Lock是接口不能直接实例化,实现类ReentrantLock来实例化ReentrantLock的构造方法
        • ReentrantLock​():创建一个ReentrantLock的实例
      • 一般使用的方法
        • Lock lock = new ReentrantLock();
        • try{ lock.lock(); …… }finally{ lock.unlock(); }
  • 生产者消费者
    • 概述
      • 生产者消费者模式是一个十分经典的多线程协作的模式
      • 包含两类线程
        • 生产者线程用于生产数据
        • 消费者线程用于消费数据
      • 为了解耦两者关系,采用共享的数据区域
        • 生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为
        • 消费者只需要从共享数据区中去获取数据,并不需要关心生产者的行为
    • 体现等待和唤醒
      • void wait​()
        • 导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法
      • void notify​()
        • 唤醒正在等待对象监视器的单个线程
      • void notifyAll​()
        • 唤醒正在等待对象监视器的所有线程

 线程周期

 

posted @ 2020-10-31 16:48  DingJie1024  阅读(66)  评论(0编辑  收藏  举报