多线程(6)线程停止
一:线程状态
①新建:Thread t=new Thread();线程对象一旦创建就进入到新生状态。
②就绪:当我们调用start()方法,线程立即进入就绪状态,但不意味立即调度执行。
③运行:运行run()方法(是我们进入就绪状态后,我们cpu调用我们的线程我们就开始执行run方法),进入运行状态,线程才真正执行线程体的代码块。
④阻塞:当调用sleep,wait或同步锁的时候,线程进入到阻塞状态;阻塞解除后,等待cpu调度执行。
⑤死亡:当执行完run()方法后线程就结束了。
二:让线程停止(采用外部标志位)
public class ThreadStop implements Runnable{ private boolean flog=true; @Override public void run() { int i=0; while (flog){ System.out.println("我是Thread-1:"+i++); } } public void stop(){ this.flog=false; } public static void main(String[] args) { ThreadStop stop=new ThreadStop(); new Thread(stop).start(); for (int i=0;i<1000;i++){ System.out.println("我是main:"+i); if (i==900){ stop.stop(); } } } }
三:线程休眠(sleep(1000)休眠1秒)
①sleep(时间)指定当前线程阻塞的毫秒数;
②sleep存在异常InterruptedException;
③sleep时间达到后线程进入就绪状态;
④sleep可以模拟网络延时,倒计时等;
⑥每一个对象都有一个锁,sleep不会释放锁;
模拟网络延时性:放大问题的发生性;
//模拟网络延时:放大问题的发生性 public class Wangluo implements Runnable{ private int i=10; @Override public void run() { while (true) { if (i<=0){ break; }//模拟延时 try { Thread.sleep(1000); }catch (Exception e){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "购买了:" + i--); } } public static void main(String[] args) { Wangluo wangluo=new Wangluo(); new Thread(wangluo,"zph").start(); new Thread(wangluo,"wlw").start(); new Thread(wangluo,"nyy").start(); } } zph购买了:10 wlw购买了:9 nyy购买了:7 zph购买了:8 nyy购买了:5 wlw购买了:6 wlw购买了:2 wlw购买了:1 nyy购买了:3 zph购买了:4
模拟倒计时:
class PPt{ public static void main(String[] args) throws InterruptedException { demo(); } public static void demo() throws InterruptedException { int i=10; while (true){ Thread.sleep(1000); System.out.println(i--); if (i<=0){ break; } } } } 10 9 8 7 6 5 4 3 2 1 Process finished with exit code 0