一、线程的状态有5种:
新生状态 就绪状态 运行状态 阻塞状态 死亡状态
二、线程的停止(重点)
1,自然终止:线程体执行完毕
2,外部干涉:
1>,线程体类 定义 线程体使用的标识
2>,线程体中使用该标识
3>,提供对外的方法改变该标识
4>,外部根据条件调用该方法
代码实现:
package com.cust.status; /** * 描述:线程的终止: * 1,自然终止:线程体执行完毕 * 2,外部干涉: * 1>,线程体类 定义 线程体使用的标识 * 2>,线程体中使用该标识 * 3>,提供对外的方法改变该标识 * 4>,外部根据条件调用该方法 * @author cookie */ public class StopDemo implements Runnable{ private boolean flag = true;//定义标识 private int num=0; @Override public void run() { while(flag){//使用标识 System.out.println("stop--->"+num++); } } public void stop(){ //对外提供改变标识的方法 this.flag = false; } public static void main(String[] args) { StopDemo s = new StopDemo(); new Thread(s).start(); for(int i = 0; i < 100; i++){ if(i==50){ s.stop();//外部调用 } System.out.println("main----->"+i); } } }
二、线程的阻塞
- join:合并线程 c.join(); //等待c先执行
- yield: static 暂停当前正在执行的线程,先让别的线程执行
Thread.yield();//谁的内部调用谁暂停
- sleep: static 睡眠 不释放锁 Thread.sleep();
与时间相关:倒计时
模拟网络延时,并发 --->Web12306
join代码实现(yield类似):
package com.cust.status; /** * 描述:线程阻塞 * join:合并线程 t.join();//先将t执行完毕 * yield:暂停自己的线程,谁调用谁暂停Thread.yield * * @author cookie */ public class JoinDemo extends Thread{ @Override public void run() { for (int i = 0; i < 1000; i++) { System.out.println("join---->"+i); } } public static void main(String[] args) throws InterruptedException { JoinDemo demo = new JoinDemo(); Thread t = new Thread(demo); t.start(); //cpu调度执行 for (int i = 0; i <100; i++) { if(50==i){ t.join();//main方法阻塞 } System.out.println("main---->"+i); } } }
sleep倒计时:
package com.cust.status; import java.sql.Date; import java.text.SimpleDateFormat; /** * * 描述:倒计时 * @author cookie */ public class SleepDemo01 { public static void main(String[] args) throws InterruptedException { //当前日期的10秒 Date endTime = new Date(System.currentTimeMillis()+1000*10); long end = endTime.getTime();//毫秒数 while(true){ System.out.println(new SimpleDateFormat("mm:ss").format(endTime));//格式化并输出 endTime = new Date(endTime.getTime()-1000);//构建下一秒时间 Thread.sleep(1000);//睡眠1秒 if((end-10000)>endTime.getTime() ){//10秒以内继续,否则退出 break; } } } public static void test1() throws InterruptedException { int num = 10; while(true){ System.out.println(num--); Thread.sleep(1000); if(num <=0){ break; } } } }
sleep网络延时---->并发