• 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​()
          • 唤醒正在等待对象监视器的所有线程

     线程周期

  • 相关阅读:
    转载:PHP JSON_ENCODE 不编码中文汉字的方法
    【TP3.2】:日志记录和查看
    PHP原生:分享一个轻量级的缓存类=>cache.php
    python: 基本的日期与时间转换
    python: 随机选择
    计算机bit是什么意思
    Python: 矩阵与线性代数运算
    Python numpy 安装以及处理报错 is not a supported wheel on this platform
    Python: 大型数组运算
    Python numpy有什么用?
  • 原文地址:https://www.cnblogs.com/jsit-dj-it/p/13906727.html
Copyright © 2020-2023  润新知