Java多线程(2)--线程周期、线程同步

线程的生命周期:(新建、就绪、运行、阻塞、死亡)

  1. 新建状态:使用new关键字创建一个线程对象后既处于新建状态,由虚拟机为其分配内存,并初始化其成员变量的值,线程执行体未执行

  2. 就绪状态:线程对象调用start()方法后处于就绪状态,由虚拟机为其创建方法调用栈和程序计数器,等待JVM里的调度器决定其何时开始运行

  3. 运行状态:若处于就绪状态的线程获得CPU,则开始执行run()方法的线程执行体,处于运行状态,直到系统分配的时间段用完则中断,运行其他线程

  4. 阻塞状态:对于抢占式,当失去处理器资源时则进入阻塞状态,或者由线程调用sleep()方法主动进入阻塞状态,被阻塞的线程解除阻塞后,重新进入就绪状态

  5. 死亡状态:线程的run()或call()执行完成,则线程结束,或线程抛出异常,或直接调用stop()方法结束线程(不推荐)

Java多线程(2)--线程周期、线程同步_第1张图片
线程的生命周期

控制线程

  • join:

    Thread类提供的join()方法

    一个线程调用另一个线程的join()方法执行另一个线程,直到该线程执行完才继续执行自己

  • 后台线程:

    在后台运行,为其他线程服务,称为“后台线程”、“守护线程”,如JVM的垃圾回收线程

    若所有前台线程死亡,则后台线程自动死亡

    调用Thread对象的setDaemon(true)方法可将指定线程设置为后台线程(在调用start()前设置)

  • 线程睡眠:sleep

    调用Thread对象的sleep(毫秒)使线程进入阻塞(挂起)状态,在sleep过程中即使有资源也不会执行,直到sleep时间结束

  • 线程让步:yield

    yield()与sleep()相似,但yield()是使线程进入就绪状态,因此有资源时便会执行

  • 线程优先级:

    线程默认的优先级与创建它的父线程相同,默认情况下,main线程具有普通优先级

    Thread类的setPriority(),getPriority()方法可设置与获得指定线程优先级,setPriority的参数为整数1-10

线程同步:多线程操作同一数据时容易出现线程不安全的问题

  • 同步代码块

    将会被多个线程访问的对象放进obj的位置,则当某个线程访问该对象时会先将其锁定,同一时刻其他线程无法修改此对象,保证了线程安全

    public void run()
    {
      synchronized(obj)//obj称为同步监视器
        {
        ...//此处代码就是同步代码块
        }
    }
    
  • 同步方法

    使用synchronized修饰实例方法,无须显式指定同步监视器,同步方法的同步监视器是this,也就是调用该方法的对象

    public class Account
    {
      public synchronized void draw(double drawAmount)
      {
          ...//此同步方法的监视器为this,即Account对象
               //线程调用Acconut对象的draw方法时,将Account对象加锁
      }
    }
    
  • 释放同步监视器的锁定

你可能感兴趣的:(Java多线程(2)--线程周期、线程同步)