线程状态及其常用方法

2020-08-27  本文已影响0人  i小雨

1、线程状态图:

1598519678(1).jpg 线程状态.PNG
图片.png 图片.png

2、线程常用方法sleep(),wait(),join(),yield():

图片.png

线程停止:

java终止线程的三种方式
提倡使用标志位的方式

package com.company.runable;

public class MyRunable implements Runnable{

    private boolean flag = true;

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            if (i==12){
                stop();
            }
            if (flag) {
                System.out.println(Thread.currentThread().getName() + "____" + i);
            }
        }
    }
    public void stop(){
        this.flag = false;
    }


    public static void main(String[] args) {
        Thread th = new Thread(new MyRunable());
        th.start();
    }
}

sleep():线程休眠

yield():线程礼让

package com.company.runable;
//测试线程礼让
public class TestYeild {
    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()+"线程执行结束");
    }
}

结果1:(礼让成功)

a线程开始执行
b线程开始执行
b线程执行结束
a线程执行结束

结果2:(礼让不成功)

a线程开始执行
a线程执行结束
b线程开始执行
b线程执行结束

Join

package com.company.runable;

public class TestJoin {

    public static void main(String[] args) {
        
        Myjoin myjoin = new Myjoin();
        Thread thread = new Thread(myjoin);
        thread.start();
        
        //主线程
        for (int i = 0; i < 20; i++) {
            if (i==10) {
                try {
                    thread.join();//thread线程插队
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("主线程"+i);
        }
    }

}
class Myjoin implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("vip线程来了"+i);
        }
    }
}

结果:

主线程0
主线程1
主线程2
主线程3
主线程4
主线程5
主线程6
主线程7
主线程8
主线程9
vip线程来了0
vip线程来了1
vip线程来了2
vip线程来了3
vip线程来了4
vip线程来了5
vip线程来了6
vip线程来了7
vip线程来了8
vip线程来了9
主线程10
主线程11
主线程12
主线程13
主线程14
主线程15
主线程16
主线程17
主线程18
主线程19

3、观测线程状态:

线程的状态:

package com.company.runable;

public class TestState {

    public static void main(String[] args) {

        Thread thread = new Thread(()->{
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("结束*****");
        });

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

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

        //循环打印线程状态
        while (state != Thread.State.TERMINATED){ //只要线程不终止,就一直输出状态
            try {
                thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            state = thread.getState();
            System.out.println(state);
        }
    }
}

结果:

NEW
RUNNABLE
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
结束*****
TERMINATED
上一篇 下一篇

猜你喜欢

热点阅读