【java基础】多线程学习

  1. 一扩展javalangThread类
  2. 二实现javalangRunnable接口
  3. 三Thread和Runnable的区别
  4. 四线程状态转换
  5. 五线程调度
  6. 六常用函数说明
    1. 使用方式
    2. 为什么要用join方法
  7. 七常见线程名词解释
  8. 八线程同步
  9. 九线程数据传递

转自:https://www.cnblogs.com/GarfieldEr007/p/5746362.html

下面自己的总结,推荐看原文

start()
    重复调用,报IllegalThreadStateException异常
    调用后将线程变为可运行状态runnable,什么时候运行由操作系统决定

多线程实现手段:
    1、扩展java.lang.Thread: extends Thread
          public void run() { …… }
    2、实现java.lang.Runnable接口:  implements Runnable,重写run方法
        @Override
            public void run() { …… }
    所有多线程代码通过Thread的start运行

线程状态转换
    新建态new
    就绪:runnable
        创建后其他线程调用了该对象的start、
        可运行池中变可运行等待获取cpu使用权
    运行态running:获取cpu、执行代码

    阻塞blocked:某种原因放弃cpu使用权,暂停运行;情况
        等待阻塞:wait后jvm将其放入等待池(wait释放持有的锁)
        同步阻塞:同步锁被两个线程占用
            运行的线程获取对象同步锁同时该同步锁被别的线程占用
            jxm将其放入锁池中
        其他阻塞:sleep、join或发出I/O请求
            jvm将线程置阻塞状态
            sleep超时、join等待线程终止或超时、I/O处理完毕:重进就绪状态
    死亡Dead:执行完、异常退出run方法

线程调度:

    优先级、int setPriority和getPriority
        MAX_PRIORITY:最高1O、MIN_PRIORITY:最低1、NORM_PRIORITY:默认5
    睡眠:Thread.sleep(long millis)进阻塞态、结束转就绪态,不释放锁,需捕获异常
        当前线程停滞,让出cpu的使用,其他对象不能访问这个对象
    等待:Object的wait释放锁 本线休眠,直到其他线程调用此对象notify、notifyAll
        进入和该对象相关的等待池中
        wait与notify要和synchronized一起使用
    睡眠和等待:
        均可通过interrupt打断线程暂停状态

    让步: Thread类的yield 暂停当前线程,把机会让给相同、更高优先级的线程
        无法保证yield达到让步目的,可能被再次选中
        从未导致线程转到等待、睡眠、阻塞态,大多数情况下从运行态转可运行态
    加入:join等待其他线程终止
        在当前线程中调用另一个线程的join方法,当前线程转阻塞态
        另一个进行运行结束,当前线程转就绪态

    唤醒:Object的notify唤醒在此对象监视器上等待的单个线程
        all线程都在等,唤其中一个
        调用其中一个的wait方法,在对象监视器上等待
        直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程
        被唤醒的线程以常规方式在该对象上主动同步其他所有线程进行竞争
        简易版:调用notify后在synchronized执行结束,自动释放锁
            jvm在wait对象锁中随机选取一线程,赋予其对象锁,唤醒线程,继续执行
    interrupt给线程发送终端信号,让线程在无限等待时可以抛错结束线程

线程同步:synchronized,取得的锁都是对象
    明确:1、对象有一个锁lock与之对应;2、实现同步开销、死锁;3、清楚对象
    对象实例内,防止多个线程同时访问这个对象的synchronized方法,间不影响
        线程访问了其中一个,其他线程不能同时访问对象中任一个synchronized方法
    类范围内:防止多线程同时访问这个类中synchronized static方法,可以对列所有对象实例起作用


https://www.cnblogs.com/GarfieldEr007/p/5746362.html

猜你喜欢

转载自blog.csdn.net/ma15732625261/article/details/80844154