线程有五种状态:新建态,就绪态,运行态,阻塞态,退出态。
新建态:当线程对象被创建时,如:Thread t = new Thread();线程就处于新建态。就绪态:但调用start()方法时,线程就进入就绪态,等待cpu的调度。运行态:cpu调度线程,线程开始运行。阻塞态:当调用wait(),sleep()方法或同步锁定时,线程就进入阻塞态,不再往下执行,直到阻塞事件解锁,重新进入就绪态。退出态:线程执行完毕或中断。调用sleep(时间)方法,参数为指定当前线程阻塞的毫秒数,存在异常InterruptedException。
//模拟网络延时:放大问题的发生性 public class tsestSleep implements Runnable { //票数 private int ticketNums = 10; @Override public void run() { // TODO Auto-generated method stub while(true) { if(ticketNums<=0) { break; } //模拟延时 try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"-->拿到了第"+ticketNums--+"票"); } } public static void main(String[] args) { tsestSleep ticket = new tsestSleep(); new Thread(ticket,"小明").start(); new Thread(ticket,"老师").start(); new Thread(ticket,"黄牛").start(); } }让当前正在执行的线程暂停,进入就绪态,cpu重新调度。礼让不一定成功。
//测试礼让线程 //礼让不一定成功 public class testYield { public static void main(String[] args) { MyYield myYield = new MyYield(); new Thread(myYield,"a").start(); new Thread(myYield,"b").start(); } } class MyYield implements Runnable{ @Override public void run() { // TODO Auto-generated method stub System.out.println(Thread.currentThread().getName()+"线程开始执行 "); Thread.yield();//礼让 System.out.println(Thread.currentThread().getName()+"线程停止 "); } }带当前线程执行完毕后,再执行其他线程,其他线程阻塞。
//测试join方法。。。插队 public class testJoin implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i = 0; i < 200; i++) { System.out.println("线程vip来了"+i); } } public static void main(String[] args) throws InterruptedException { //启动线程 testJoin tjoin = new testJoin(); Thread thread = new Thread(tjoin); thread.start(); //主线程 for(int i = 0; i < 1000; i++) { if(i==200) { thread.join(); } System.out.println("main"+i); } } }调用setPriority()设置线程的优先级,10为最高,1最低。
//测试线程的优先级 public class testPriority { public static void main(String[] args) { //主线程默认优先级 System.out.println(Thread.currentThread().getName()+"->"+Thread.currentThread().getPriority()); MyPriority myPriority = new MyPriority(); Thread t1 = new Thread(myPriority); Thread t2 = new Thread(myPriority); Thread t3 = new Thread(myPriority); Thread t4 = new Thread(myPriority); Thread t5 = new Thread(myPriority); Thread t6 = new Thread(myPriority); //先设置优先级再启动 t1.start(); t2.setPriority(1); t2.start(); t3.setPriority(4); t3.start(); t4.setPriority(Thread.MAX_PRIORITY); t4.start(); t5.setPriority(8); t5.start(); t6.setPriority(7); t6.start(); } } class MyPriority implements Runnable{ @Override public void run() { // TODO Auto-generated method stub System.out.println(Thread.currentThread().getName()+"->"+Thread.currentThread().getPriority()); } }线程分为用户线程和守护线程,虚拟机必须确保用户线程执行完毕,但不用等待守护线程执行完毕。
//测试守护线程 public class testDaemon { public static void main(String[] args) { God god = new God(); You you = new You(); Thread thread = new Thread(god); thread.setDaemon(true);//默认是false,即为用户线程 thread.start(); new Thread(you).start();//用户线程,用户线程执行完毕,守护线程也停止 } } class God implements Runnable{ @Override public void run() { // TODO Auto-generated method stub System.out.println("上帝保佑你"); } } class You implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i = 0; i < 36500; i++) { System.out.println("你一生都开心的活着"); } System.out.println("===goodbye! world!==="); } }