• 多线程&定时器Timer&同步&线程通信&ThreadLocal


    1.多线程

    • 线程状态分为:新建状态、就绪状态、运行状态、阻塞状态、死亡状态
      • 对象等待池的阻塞状态:运行状态执行了wait方法
      • 对向锁池的阻塞状态:试图获得某个同步锁,已经被其他线程占用,就会放到对象的锁池中
      • 其他阻塞状态:执行了sleep()方法、join方法()
    • 线程睡眠Thread.sleep()方法:当前线程放弃cpu,转到阻塞状态
    • 线程让步Thead.yield()静态方法:如果此时具有相同优先级的其他线程处于就绪状态,那么 yield()方法将把当前运行的线程放到可运行池中并使另一个线程运行。如果没有相同优先级的可运行线程,则此方法什么都不做。
    • 等待其他线程结束 join()方法:当前运行的线程可以调用另一个线程的 join()方法,当前运行的线程将转到阻塞状态,直至另一个线程运行结束,它才恢复运行。
    • machin.join() 就是执行的这个线程停止让给machin线程运行
    • 设置后台线程 Thread.setaemon(true)方法,就可以把当前线程设置为后台线程

    2.定时器Timer

    Timer timer = new Timer(true) //把与Timer关联的线程设置为后台线程
    TimerTask task = new TimerTask(){//匿名内部类实现run方法
        timer.schedule(task,10,500); //task用来设定所要定时器执行的任务;10为延迟执行的时间ms;500为每隔500ms重复执行一次任务
    }

    3.同步

    • 同步代码块
      • synchronized(this){} this表示引用当前类对象的锁
    • 同步方法锁
      • public synchronized String pop(){}
    • 什么情况会释放锁?
      • 执行完同步代码块,就会释放锁
      • 在执行同步代码块的过程中,遇到异常而导致线程终止,锁也会被释放
      • 在执行同步代码块的过程中,执行了锁所属对象的wait()方法,这个线程会释放锁,进入对象的等待池
    • 什么情况不会释放锁?
      • 在执行同步代码块的过程中,执行了 Thread.sleep()方法,当前线程放弃 CPU,开始睡眠,在睡眠中不会释放锁
      • 在执行同步代码块的过程中,执行了 Thread.yield()方法,当前线程放弃 CPU,但不会释放锁
      • 在执行同步代码块的过程中,其他线程执行了当前线程对象的 supend()发昂发,当前线程被暂停,但不会释放锁。Thread类的 supend()方法已经被废弃

    4.线程通信

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

    5.中断阻塞

    •  当线程 A 处于阻塞状态时, 如果线程 B 调用线程 A 的 interrupt()方法,那么线程 A 会接收到一个 InterruptedException,并退出阻塞状态,开始进行异常处理

    6.线程控制

    • start():启动线程
    • suspend():使线程暂停(被废弃)
    • resume():使暂停的线程恢复运行(被废弃)
    • stop()::终止线程(被废弃)

    7.线程组 

    • ThreadGroup类的 activeCount()方法:获得当前或者的线程的数目
    • ThreadGroup类的 enumerate(machines)方法:该方法把当前活着的线程引用存放到参数machines中
    • main(){
          ThreadGroup group = new ThreadGroup("machines");
          for(int i = 1;i <= 5;i++){
              Machine machine = new Machine(group,"machine"+i);
              machine.start();
          }
          int activeCount = group.activeCount();
          Thread[] machines = new Thread[activeCount];
          group.enumerate(machines);
          for(int i = 0;i < activeCount;i++)
              syso(machines[i].getName()+" is alive");
      }            

    8.ThreadLocal

    • ThreadLocal类 可以用来存放线程的局部变量,每个线程都有单独的局部变量,彼此之间不会共享
      •  public T get():返回当前线程的局部变量
      •  protected T initialValue():返回当前线程的局部变量的初始值
      •  public void set(T value):设置当前线程的局部变量
      •  ThreadLocal类中有一个Map 缓存,用户存储每一个线程的局部变量
  • 相关阅读:
    LINQ查询表达式(1)
    JSON是什么
    .net序列化
    wampserver
    JQuery系列(1)
    c# 数据类型转换
    并不对劲的uoj311.[UNR #2]积劳成疾
    并不对劲的uoj308.[UNR #2]UOJ拯救计划
    并不对劲的CF1349B&C:Game of Median Life
    并不对劲的复健训练-CF1329B&C:Heap Sequences
  • 原文地址:https://www.cnblogs.com/moster/p/8665559.html
Copyright © 2020-2023  润新知