码迷,mamicode.com
首页 > 编程语言 > 详细

线程的状态和常见方法

时间:2020-07-08 23:09:51      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:end   margin   ext   sys   color   rup   illegal   strong   nat   

一、线程的状态:

  新建状态(NEW):线程刚被创建,还没被启动。

  Runable状态:线程对象调用start方法,被线程调度器来执行。

    1.就绪状态(Ready):线程被启动,加入CPU等待队列,等待CPU运行。

    2.运行状态(Running):在CPU上运行。

  结束状态(Terminated):线程正常结束。线程正常结束以后,不能再次调用start方法,会抛出异常:java.lang.IllegalThreadStateException  

  TimedWaiting等待、Waiting等待、Blocked阻塞

技术图片

  测试线程状态:

  

public class T04_ThreadState {
    static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("---state1:" + this.getState());

            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        System.out.println("-----state2:"+t1.getState());
        t1.start(); //启动线程
        try {
            t1.join();//main方法等待线程结束
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("-----state3:"+t1.getState());
    }
}

技术图片

 

 

 

 

二、线程常见的几种方法:

  1.Sleep:线程睡眠,暂停一段时间让给其他线程去执行,到时间后复活

/**
     * 线程睡眠,暂停一段时间让给其他线程去执行,到时间后复活
     */
    static void testSleep(){
        new Thread(()->{
            for (int i = 0; i < 20; i++){
                System.out.println("-------->T"+i);
                if(i % 5 == 0){
                    try {
                        TimeUnit.MILLISECONDS.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
        }).start();
    }

  2.Yield:线程回到等待队列,等待再次被调度

/**
     * yield():线程回到等待队列,等待再次被调度
     */
    static void testYield(){
        new Thread(()->{
            for (int i = 1; i < 101; i++){
                System.out.println("-------->A"+i);
                if(i % 10 == 0){
                    Thread.yield();
                }
            }
        }).start();
        new Thread(()->{
            for (int i = 0; i < 100; i++){
                System.out.println("-------->B"+i);
                if(i % 10 == 0){
                    Thread.yield();
                }
            }
        }).start();
    }

  3.Join:当前线程加入调用join方法的线程,本线程等待,等A运行完了以后,B继续执行。

/**
     * join(): 当前线程加入调用join方法的线程,本线程等待,等A运行完了以后,B继续执行。
     */
    static void testJoin(){
        Thread t1 = new Thread(()->{
            for (int i = 0; i < 100; i++) {
                System.out.println("------>A0"+i);
            }
        });
        t1.start();
        new Thread(()->{
            for (int i = 0; i < 100; i++){
                if(i == 4){
                    try {
                        t1.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("B0"+i);
            }
        }).start();
    } 

执行结果如下:

技术图片

 

线程的状态和常见方法

标签:end   margin   ext   sys   color   rup   illegal   strong   nat   

原文地址:https://www.cnblogs.com/helq/p/13269493.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!