线程的状态---十九

来源:互联网 发布:绍兴网络电视台 跃马 编辑:程序博客网 时间:2024/05/02 00:05
/**
 * 1)线程的状态
 *                        阻塞(sleep(),yiled(),jion())
 *                                        /         \
 *                                      /             \
 * (new)新生--(start())就绪-------运行-----死亡()
 * 2)停止线程(建议下面2中方式,温柔不暴力)
 *   1、自然终止:线程体执行完毕,结束任务
 *   2、外部干涉
 *      a、定义flag属性标识    b、线程体使用flag标识  c、对外提供改变flag属性的方法
 * 3)线程阻塞
 *   1、join(合并线程)成员方法:t.join()方法阻塞调用此t成员方法jion的线程(calling thread),直到线程t完成,
 *           此线程再继续;通常用于在main()主线程内,等待t线程完成再结束main()主线程。
 *           从这里应该能猜的到,Thread类的jion方法是加锁的,并且是个陷进,谁调用,谁在外面等。    
 *   2、yield静态方法: 暂停自己的线程,让出cpu调度,品格高尚!
 *   3、sleep静态方法:休眠(睡觉),不释放锁 (抱着锁睡),其他线程不能访问,除非睡醒,结束线程。
 *      应用场景:a、倒计时    b、模拟网络延时    
 */ 
public class StateThr {
public static void main(String[] args) throws InterruptedException {
FourThr fth=new FourThr("马云");  //新生
Thread proxy=new Thread(fth,"黄牛甲");
proxy.start();//就绪

//就绪后,等待cpu调度分配时间片---运行

Thread.sleep(5000);//放票时间5秒

fth.stop();//线程终止,死亡
}
}


class FourThr implements Runnable{
private int tickets=50;
private String name;
private boolean flag=true;

public FourThr(String name) {
this.name = name;
}
@Override
public void run() {//线程体
while(flag){
try {
task();
Thread.sleep(500);   //模拟延时时间,阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
private void task(){
if(tickets>0){
System.out.println(Thread.currentThread().getName()+",帮"+this.name+",抢到第"+(tickets--)+"张票");
}

}
public void stop(){
flag=false;
}
}