线程的生命周期:(新建、就绪、运行、阻塞、死亡)
新建状态:使用new关键字创建一个线程对象后既处于新建状态,由虚拟机为其分配内存,并初始化其成员变量的值,线程执行体未执行
就绪状态:线程对象调用start()方法后处于就绪状态,由虚拟机为其创建方法调用栈和程序计数器,等待JVM里的调度器决定其何时开始运行
运行状态:若处于就绪状态的线程获得CPU,则开始执行run()方法的线程执行体,处于运行状态,直到系统分配的时间段用完则中断,运行其他线程
阻塞状态:对于抢占式,当失去处理器资源时则进入阻塞状态,或者由线程调用sleep()方法主动进入阻塞状态,被阻塞的线程解除阻塞后,重新进入就绪状态
死亡状态:线程的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对象加锁 } }
释放同步监视器的锁定