thread的基本操作

作者: 无尘粉笔 | 来源:发表于2021-05-16 09:41 被阅读0次

    线程有一个状态的概念,Thread有一个方法用于获取线程的状态:

    public enum State {
    
            NEW,
    
            RUNNABLE,
    
            BLOCKED,
    
            WAITING,
    
            TIMED_WAITING,
    
            TERMINATED;
        }
    
    • NEW:没有调用start的线程状态为NEW。
    • TERMINATED:线程运行结束后状态为TERMINATED。
    • RUNNABLE:调用start后线程在执行run方法且没有阻塞时状态为RUNNABLE,不过,RUNNABLE不代表CPU一定在执行该线程的代码,可能正在执行也可能在等待操作系统分配时间片,只是它没有在等待其他条件。
    • BLOCKED、WAITING、TIMED_WAITING:都表示线程被阻塞了,在等待一些条件。

    daemon线程

    启动线程会启动一条单独的执行流,整个程序只有在所有线程都结束的时候才退出,但daemon线程是例外,当整个程序中剩下的都是daemon线程的时候,程序就会退出。

    我们举个例子

    import lombok.SneakyThrows;
    
    /**
     * @author wcfb
     * @time 2021/5/15/015.
     * @since
     */
    public class StudentThread extends Thread {
        @SneakyThrows
        @Override
        public void run() {
            System.out.println("student: i am a student!");
            for (int i = 0; i < 5; i++) {
                sleep(1000);
                System.out.println("student: i need to do homework." + i);
            }
        }
    }
    
    import lombok.SneakyThrows;
    
    /**
     * @author wcfb
     * @time 2021/5/15/015.
     * @since
     */
    public class TeacherThread implements Runnable {
        @SneakyThrows
        @Override
        public void run() {
            System.out.println("teacher: i am a teacher!");
            for (int i = 0; i < 10; i++) {
                Thread.sleep(1000);
                System.out.println("teacher: i need work." + i);
            }
        }
    }
    
    /**
     * @author wcfb
     * @time 2021/5/15/015.
     * @since
     */
    public class ThreadTest {
    
        public static void main(String[] args) throws InterruptedException {
            Thread teacher = new Thread(new TeacherThread());
            Thread student = new Thread(new StudentThread());
    
    //        teacher.setDaemon(true);
            System.out.println("teacher is daemon " + teacher.isDaemon());
            System.out.println("student is daemon " + student.isDaemon());
    
            student.start();
            teacher.start();
    
            Thread.sleep(1000);
            System.out.println("student is alive " + student.isAlive());
            System.out.println("teacher is alive " + teacher.isAlive());
        }
    }
    

    我们现将teacher.setDaemon(true); 这行注释掉。
    查看一下执行结果


    image.png

    然后我们将注解打开执行一次


    image.png

    我们可以看到,当teacher如果是daemon时,不需要等到他全部执行完毕。

    相关文章

      网友评论

        本文标题:thread的基本操作

        本文链接:https://www.haomeiwen.com/subject/gsfkjltx.html