zoukankan      html  css  js  c++  java
  • Java多线程系列---“基础篇”10之 线程优先级和守护线程

    转自:https://www.cnblogs.com/weishao-lsv/p/8143976.html

    在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)

    Java平台把操作系统的底层进行了屏蔽,在JVM虚拟平台里面构造出对自己有利的机制,这就是守护线程的由来。Daemon的作用是为其他线程的运行提供服务,比如说GC线程。

    User Thread线程和Daemon Thread唯一的区别之处就在虚拟机的离开,如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了。

    守护线程用户也可以自行设定,方法:public final void setDaemon(boolean flag) 

    注意点:

      正在运行的常规线程不能设置为守护线程。

      thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。

      在Daemon线程中产生的新线程也是Daemon的(这里要和linux的区分,linux中守护进程fork()出来的子进程不再是守护进程)

      根据自己的场景使用(在应用中,有可能你的Daemon Thread还没来的及进行操作时,虚拟机可能已经退出了)

    非守护线程案例:

      

    复制代码
    public class DaemonTest {
        
         public static void main(String[] args) {
             Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("thread 线程结束....");
                }
            });
            thread.start();
            System.out.println("main线程 结束....");
        }
         
    }
    复制代码

    结果输出:

      main线程 结束....
      thread 线程结束....

    守护线程案例:

    复制代码
    package cn.kafka.t;
    
    public class DaemonTest {
        
         public static void main(String[] args) {
             Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("thread 线程结束....");
                }
            });
         //设置为守护线程 thread.setDaemon(true); thread.start(); System.out.println("main线程 结束...."); } }
    复制代码

    结果输出:

      main线程 结束....

    结论:主线程结束,JVM直接退出,守护线程不管是否运行结束都要伴随着JVM的退出而退出

    优先级

    线程有一个优先级的概念,在Java中,优先级从1到10,默认为5,相关方法是:

    public final void setPriority(int newPriority)
    public final int getPriority()

    这个优先级会被映射到操作系统中线程的优先级,不过,因为操作系统各不相同,不一定都是10个优先级,Java中不同的优先级可能会被映射到操作系统中相同的优先级,另外,优先级对操作系统而言更多的是一种建议和提示,而非强制,简单的说,在编程中,不要过于依赖优先级。

    状态

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

    public State getState()

    返回值类型为Thread.State,它是一个枚举类型,有如下值:

    复制代码
    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:都表示线程被阻塞了,在等待一些条件,其中的区别我们在后续章节再介绍 
  • 相关阅读:
    进制转换
    体验mssql-cli
    从Windows迁移SQL Server到Linux
    CentOS7脱机安装SQL Server 2017
    基础知识:数据类型优先级
    SQL Server 2016正式版安装(超多图)
    制造高CPU使用率的简单方法
    SQL Server启动的几种方法
    SQL Server 2016 RC0 安装(超多图)
    机器学习:Python实现单层Rosenblatt感知器
  • 原文地址:https://www.cnblogs.com/Hermioner/p/9860521.html
Copyright © 2011-2022 走看看