多线程(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

 

posted @ 2021-04-30 09:46  iLisa  阅读(114)  评论(0编辑  收藏  举报