JAVA学习笔记50——线程状态+停止进程+阻塞进程

来源:互联网 发布:南昌有mac专柜吗 编辑:程序博客网 时间:2024/05/22 15:25

最近在看JAVA教学的视频,觉得老师讲的很好,同时借用源代码还有笔记来撰写本系列博客,记录自己的学习内容,同时也供看到的人学习。

本篇介绍三大部分内容,首先来看第一部分:线程的状态

下图是线程状态的转换图:


线程各个状态的具体介绍以及在JAVA中的使用方法:


第二个内容是介绍线程的停止:

1、自然终止:线程体正常执行完毕

2、外部干涉:

 1)、线程类中 定义 线程体使用的标识

 2)、线程体使用该标识

 3)、提供对外的方法改变该标识

 4)、外部根据条件调用该方法即可

下面是实例代码:

public class StopDemo01 {public static void main(String[] args) {Study s =new Study();new Thread(s).start();  //使用匿名类//外部干涉for(int i=0;i<100;i++){if(50==i){ //外部干涉s.stop();}System.out.println("main.....-->"+i);}}}class Study implements Runnable{ //1)、线程类中 定义 线程体使用的标识 private boolean flag =true;@Overridepublic void run() {//2)、线程体使用该标识while(flag){System.out.println("study thread....");}}//3)、对外提供方法改变标识public void stop(){this.flag =false;}}
第三个内容是线程的阻塞:

1、join :合并线程

2、yield:暂停自己的线程   static

3、sleep:休眠,不释放锁 

  1)、与时间相关:倒计时

  2)、模拟网络延时

NO.1:合并进程的示例代码:

/** * join:合并线程 */public class JoinDemo01 extends Thread {/** * @param args * @throws InterruptedException  */public static void main(String[] args) throws InterruptedException {JoinDemo01 demo = new JoinDemo01();Thread t = new Thread(demo); //新生t.start();//就绪//cpu调度 运行for(int i=0;i<1000;i++){if(50==i){t.join(); //main方法阻塞...,50之后就只会进行run的,run的结束后再执行main的}System.out.println("main...."+i);}}@Overridepublic void run() {for(int i=0;i<1000;i++){System.out.println("join...."+i);}}}
NO.2:yield的示例代码:

public class YieldDemo01 extends Thread {public static void main(String[] args) {YieldDemo01 demo = new YieldDemo01();Thread t = new Thread(demo); //新生t.start();//就绪//cpu调度 运行for(int i=0;i<1000;i++){if(i%20==0){//暂停本线程 main(规则:写在哪个方法里面就暂停哪个方法)Thread.yield();}System.out.println("main...."+i);}}@Overridepublic void run() {for(int i=0;i<1000;i++){System.out.println("yield...."+i);}}}
NO.3:sleep的两段示例代码:

import java.text.SimpleDateFormat;import java.util.Date;/** * 倒计时 * 1、倒数10个数,一秒内打印一个 * 2、倒计时 */public class SleepDemo01 {/** * @param args * @throws InterruptedException  */public static void main(String[] args) throws InterruptedException {Date endTime =new Date(System.currentTimeMillis()+10*1000);long end =endTime.getTime();while(true){//输出System.out.println(new SimpleDateFormat("mm:ss").format(endTime));//等待一秒Thread.sleep(1000);//构建下一秒时间endTime =new Date(endTime.getTime()-1000);//10秒以内 继续 否则 退出if(end-10000>endTime.getTime()){break;}}}public static void test1() throws InterruptedException{int num =10;while(true){System.out.println(num--);Thread.sleep(1000); //暂停if(num<=0){break;}}}}
/** * Sleep模拟 网络延时  线程不安全的类 * */public class SleepDemo02 {/** * @param args */public static void main(String[] args) {//真实角色Web12306 web= new Web12306();Web12306 web2 = new Web12306();//代理Thread t1 =new Thread(web,"路人甲");Thread t2 =new Thread(web,"黄牛已");Thread t3 =new Thread(web,"攻城师");//启动线程t1.start();t2.start();t3.start();}}class Web12306 implements Runnable {private int num =50;@Overridepublic void run() {while(true){if(num<=0){break; //跳出循环}try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"抢到了"+num--);}}}
到这片博客满50篇了,也达到了寒假的计划要求···





0 0
原创粉丝点击