线程状态

线程停止

停止线程

package com.lei.state;

//测试stop
//1.建议线程正常停止-->利用次数,不建议死循环
//2.建议使用标志位-->设置一个标志位flag
//3.不要使用stop或者destory等过时或者JDK不建议使用的方法

public class TestStop implements Runnable{

    //1.设置一个标志位
    private boolean flag=true;

    @Override
    public void run() {
        int i=0;
        while (flag){
            System.out.println("run...Thread"+i++);
        }
    }

    //2.设置一个公开的方法停止线程,转换标志位
    public void stop(){
        this.flag=false;
    }

    public static void main(String[] args) {
        TestStop testStop = new TestStop();

        new Thread(testStop).start();

        for (int i = 0; i < 1000; i++) {
            System.out.println("线程进行到第"+i+"步");
            if(i==900){
                testStop.stop();
                System.out.println("该线程已停止走到"+i+"停止啦");
            }
        }
    }
}

倒计时/计时器

package com.lei.state;

import java.text.SimpleDateFormat;
import java.util.Date;

//模拟倒计时
public class TestSleep2{
    public static void main(String[] args) throws InterruptedException {
        //倒计时
//        tenDown();
        
        //打印当前系统时间
        Date startTime = new Date(System.currentTimeMillis());//获取系统当前时间

        while(true){
            Thread.sleep(1000);
            System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
            startTime = new Date(System.currentTimeMillis());//更新当前时间
        }
    }

    public static void tenDown() throws InterruptedException {
        int num=10;
        while(true){
            Thread.sleep(1000);
            System.out.println(num--);
            if (num<=0){
                break;
            }
        }
    }
}

 弹幕说好像单核cpu才会考虑礼让问题

这样得结果好像和多线程有关

这一块暂时不太懂

这一块好像有些问题,写不写yeild都会礼让


package com.lei.state;

public class TestYield {
    public static void main(String[] args) {
        MyYield myYield=new MyYield();

        new Thread(myYield,"A").start();
        new Thread(myYield,"B").start();
    }
}


class MyYield implements Runnable{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"线程开始执行");
        //Thread.yield();//礼让
        System.out.println(Thread.currentThread().getName()+"线程停止执行");
    }
}

 

线程强制执行

强制执行/很少用

package com.lei.state;

//join方法,想象成插队
public class TestJoin implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("线程vip来了");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        TestJoin testJoin=new TestJoin();

        Thread thread = new Thread(testJoin);
        thread.start();

        //主线程
        for (int i = 0; i < 1000; i++) {
            if (i==200){
                //放在此处run方法等到i=200才会开始插队,放在外面可能还没到200
                //因为主线程阻塞已经执行完毕
                //join回让i==200之前,一定插队完毕
                //thread.start();
                thread.join();//插队
            }
            System.out.println("main"+i);
        }

    }
}

 

线程的状态

查看代码

package com.lei.state;

//观察测试线程的状态
public class TestState {

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("/////");
        });

        //观察状态
        Thread.State state=thread.getState();
        System.out.println(state);//NEW

        //观察启动后
        thread.start();//启动线程
        state=thread.getState();
        System.out.println(state);//Run

        while (state!=Thread.State.TERMINATED){//只要线程不终止就一直输出
            Thread.sleep(100);
            state=thread.getState();//更新线程状态
            System.out.println(state);
        }
        thread.start();//死亡后的线程不能再次被启用
    }
}

执行的顺序是按照线程的生命周期,而不是代码的书写顺序。

也没弄懂上面程序的输出顺序

 

posted @ 2022-04-13 13:26  Eveeee  阅读(28)  评论(0)    收藏  举报