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:都表示线程被阻塞了,在等待一些条件,其中的区别我们在后续章节再介绍 
  • 相关阅读:
    Dynamics AX 2012 R2 配置E-Mail模板
    Dynamics AX 2012 R2 设置E-Mail
    Dynamics AX 2012 R2 为运行失败的批处理任务设置预警
    Dynamics AX 2012 R2 耗尽用户
    Dynamics AX 2012 R2 创建一个专用的批处理服务器
    Dynamics AX 2012 R2 创建一个带有负载均衡的服务器集群
    Dynamics AX 2012 R2 安装额外的AOS
    Dynamics AX 2012 R2 将系统用户账号连接到工作人员记录
    Dynamics AX 2012 R2 从代码中调用SSRS Report
    Dynamics AX 2012 R2 IIS WebSite Unauthorized 401
  • 原文地址:https://www.cnblogs.com/Hermioner/p/9860521.html
Copyright © 2011-2022 走看看