创建状态
线程对象创建就进入了创建状态
就绪状态
调用start(),线程进入就绪状态,但还没有具体执行
运行状态
执行线程体的代码块时,线程处于运行状态
阻塞状态
当调用sleep()等方法时,线程进入阻塞状态,线程暂时不执行,等阻塞事件解除后再执行
死亡状态
线程结束进入死亡状态,进入死亡状态后的线程不能再启动
其转换关系如下图
Thread.State = NEW
已经创建但尚未启动的线程处于此状态
Thread.State = RUNNABLE
正在Java虚拟机中执行的线程处于此状态
Thread.State = BLOCKED
被阻塞等待监视器锁定的线程处于此状态
Thread.State = WAITING
正在等待另一个线程执行特定动作的线程处于此状态
Thread.State = TIMED_WAITING
正在等待另一个线程执行动作经过指定等待时间的线程处于此状态
Thread.State = TERMINATED
已经退出的线程处于此状态,已退出的线程不能再启动
建议让线程在循环结束时自己停止,不要用stop()和destroy()
线程休眠 sleep()sleep(时间) 指定当前线程阻塞的毫秒数sleep() 存在异常InterruptedException,需要抛出每个对象都有一个锁,sleep不会释放锁 线程礼让 yield()
线程礼让使已经在执行的线程暂停(但不阻塞),然后从运行状态转为就绪状态,让CPU重新调度
public class DemoYield { public static void main(String[] args) { Yield yield = new Yield(); new Thread(yield,"a").start(); new Thread(yield,"b").start(); } } class Yield implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName()+"线程开始执行"); Thread.yield(); //礼让 System.out.println(Thread.currentThread().getName()+"线程停止"); } }
这是因为线程礼让不一定让另一个线程先执行,因为礼让后两个线程同为就绪状态,先执行哪个要看CPU脸色
线程强制执行 join()可以暂停正在执行的线程,让另一个线程插队先执行完毕,然后原来的进程再继续执行
public class DemoJoin { public static void main(String[] args) { Common common = new Common(); new Thread(common).start(); } } class Common implements Runnable{ Vip vip = new Vip(); Thread thread = new Thread(vip); @Override public void run() { for (int i = 0; i < 500; i++) { if (i==200){ try { thread.start(); thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("普通线程执行—----"+i); } } }守护线程 daemon
线程分为用户线程和守护线程
用户线程就是普通的线程,需要手动让它停下来,虚拟机必须确保用户线程执行完毕
而虚拟机不用等待守护线程执行完毕,用户线程执行完了虚拟机就关闭,守护线程自然也停止了
public class DemoDaemon { public static void main(String[] args) { Person you = new Person(); God god = new God(); Thread godThread = new Thread(god); godThread.setDaemon(true); //将上帝保佑设为守护线程 godThread.start(); Thread personThread = new Thread(you); personThread.start(); } } class Person implements Runnable { @Override public void run() { for (int i = 0; i < 30000; i++) { System.out.println("开心地活了 "+i+" 天"); } } } class God implements Runnable { @Override public void run() { while (true){ //守护线程无限循环也没关系 System.out.println("上帝保佑着你"); } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)