2.线程之状态

Posted 菜包包

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.线程之状态相关的知识,希望对你有一定的参考价值。

一、线程的状态有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网络延时---->并发

以上是关于2.线程之状态的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程之线程定义状态和属性

2.线程之状态

JavaSE线程基础

四十Linux 线程——线程同步之条件变量之线程状态转换

Java基础之多线程

java多线程2.线程安全之可见性