美文网首页
Java多线程(2)--线程周期、线程同步

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

作者: Kylin824 | 来源:发表于2017-12-08 10:44 被阅读0次

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

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

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

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

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

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

    线程的生命周期

    控制线程

    • 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)--线程周期、线程同步

          本文链接:https://www.haomeiwen.com/subject/isteixtx.html