JavaWeb5-线程常用属性

news2024/10/2 14:36:59

目录

1.ID

2.名称

3.状态

4.优先级

5.是否守护线程

5.1.线程类型:

①用户线程(main线程默认是用户线程)

②守护线程(后台/系统线程)

5.2.守护线程作用

5.3.守护线程应用

5.4.守护线程使用

①在用户线程(main线程)中创建的子线程默认情况下也是用户线程

②在守护线程中创建的子线程默认情况下也是守护线程

③守护线程和用户线程的区别

6.是否存活

7.是否被中断

PS:线程执行顺序or随机判断准则


1.ID

是线程的唯⼀标识,不同线程ID不会重复,是动态分配的。(相当于进程PID)

2.名称

是各种调试⼯具⽤到,默认不同线程名称是不同的,但若手动指定不同线程名称可以重复。

/**
 * 线程属性:id、name
 */
public class ThreadDemo13 {
    public static void main(String[] args) throws InterruptedException {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                //得到执行当前任务的线程
                Thread t = Thread.currentThread();
                //打印线程id(是long类型)
                System.out.println("线程ID:" + t.getId());
                //打印线程名称
                System.out.println("线程名称:" + t.getName());
            }
        };

        Thread thread = new Thread(runnable,"线程1");
        thread.start();

        Thread.sleep(500);
        System.out.println();

        Thread thread2 = new Thread(runnable,"线程1");
        thread2.start();
    }
}

3.状态

表示线程当前所处的⼀个情况。

/**
 * 线程状态的流转
 */
public class ThreadDemoByState {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                //拿到当前线程,并打印当前线程的状态
                Thread thread = Thread.currentThread();
                System.out.println("线程状态2:" + thread.getState());
            }
        });
        //打印线程的状态
        System.out.println("线程状态:" + t.getState());
        t.start();

        //再次打印线程状态
        Thread.sleep(500);
        System.out.println("线程状态3:" + t.getState());
    }
}

4.优先级

优先级⾼的线程理论上来说更容易被调度到。

线程创建之后,优先级就已经存在了。

/**
 * 获取线程优先级
 */
public class ThreadDemoByPriority {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                //得到当前线程,并打印线程优先级
                Thread t = Thread.currentThread();
                System.out.println("线程优先级:" + t.getPriority());
            }
        });
        System.out.println("线程优先级2:" + thread.getPriority());
        thread.start();
        Thread.sleep(500);
        System.out.println("线程优先级3:" + thread.getPriority());
    }
}

线程优先级是int类型值,为1-10,最小优先级是1,最高优先级是10,默认优先级是5。

设置线程优先级(2种):

t1.setPriority(Thread.MAX_PRIORITY);
t1.setPriority(10);
/**
 * 设置线程优先级
 */
public class ThreadDemoByPriority2 {
    private final static int MAX_COUNT = 7;
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                //得到当前线程
                Thread t = Thread.currentThread();
                //得到线程的优先级
                int priority = t.getPriority();
                for (int i = 0; i < MAX_COUNT; i++) {
                    System.out.println(t.getName() + "——优先级:" + priority);
                }
            }
        },"线程1");
        //设置线程优先级(2种写法)
//        t1.setPriority(10); //直接赋值
        t1.setPriority(Thread.MAX_PRIORITY); //枚举

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                Thread t = Thread.currentThread();
                int priority = t.getPriority();
                for (int i = 0; i < MAX_COUNT; i++) {
                    System.out.println(t.getName() + "——优先级:" + priority);
                }
            }
        },"线程2");
        t2.setPriority(Thread.MIN_PRIORITY);

        Thread t3 = new Thread(new Runnable() {
            @Override
            public void run() {
                Thread t = Thread.currentThread();
                int priority = t.getPriority();
                for (int i = 0; i < MAX_COUNT; i++) {
                    System.out.println(t.getName() + "——优先级:" + priority);
                }
            }
        },"线程3");
        t3.setPriority(Thread.NORM_PRIORITY);

        //同时启动线程(非常快,可以认为是同时的)
        t2.start();
        t1.start();
        t3.start();
    }
}

多个线程设置了不同的优先级,同时启动这多个线程,并不是优先级最高的一定先执行完之后再执行优先级最低的线程,而是高优先级获取到CPU时间片的概率更多,整个执行大致符合高优先级的线程最先执行完。

快捷键设置:

ctrl+F查找

ctrl+H替换

5.是否守护线程

5.1.线程类型:

①用户线程(main线程默认是用户线程)

程序员创建的线程。

②守护线程(后台/系统线程)

5.2.守护线程作用

守护线程是为⽤户线程服务的,当一个程序中的所有⽤户线程全部结束之后,守护线程会跟随结束。

5.3.守护线程应用

JVM 中的垃圾回收器就是典型的守护线程,程序运⾏的时候它也运⾏,当满⾜条件时进⾏垃圾回收,在一个进程中所有非后台线程执⾏完任务终⽌时它才会结束运行。

5.4.守护线程使用

//获取当前线程是否是守护线程
thread.isDaemon()
//true->守护线程; false->用户线程
//手动指定线程类型
t1.setDaemon(true);
//true->守护线程; false->用户线程

①在用户线程(main线程)中创建的子线程默认情况下也是用户线程

/**
 * 守护线程示例
 */
public class ThreadDemoByDaemon {
    public static void main(String[] args) {
        //得到当前的线程(main主线程)
        Thread thread = Thread.currentThread();
        System.out.println("是否是守护线程:" + thread.isDaemon());

        Thread t1 = new Thread(() -> {
            //得到当前线程
            Thread cThread = Thread.currentThread();
            System.out.println(cThread.getName() + "——是否是守护线程:" + thread.isDaemon());
        },"子线程1");
        t1.start(); //启动线程
    }
}

②在守护线程中创建的子线程默认情况下也是守护线程

/**
 * 守护线程示例
 */
public class ThreadDemoByDaemon {
    public static void main(String[] args) throws InterruptedException {
        //得到当前的线程(main主线程)
        Thread thread = Thread.currentThread();
        System.out.println(thread.getName() + "——是否是守护线程:" + thread.isDaemon());

        Thread t1 = new Thread(() -> {
            //得到当前线程
            Thread cThread = Thread.currentThread();
            System.out.println(cThread.getName() + "——是否是守护线程:" + cThread.isDaemon());

            //创建子线程
            Thread tt1 = new Thread(() -> {
                Thread cThread2 = Thread.currentThread();
                System.out.println(cThread2.getName() + "——是否是守护线程:" + cThread2.isDaemon());
            },"子线程的子线程1");
            tt1.start();

        },"子线程1");

        //手动指定线程为守护线程
        t1.setDaemon(true);
        t1.start(); //启动线程

        //主线程休眠1s
        Thread.sleep(1000);
    }
}

注:线程类型(用户or守护)不能在线程运行期间,也就是调用了 start() 之后设置,否则JVM会报错。

③守护线程和用户线程的区别

/**
 * 对比用户线程和守护线程的区别
 */
public class ThreadDemoByDaemon2 {
    public static void main(String[] args) throws InterruptedException {
        userThread();
        daemonThread();
    }

    /**
     * 用户线程
     */
    private static void userThread() {
        Thread thread = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                System.out.println("用户线程执行:" + i);
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }

    /**
     * 守护线程
     */
    private static void daemonThread() {
        Thread t = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                System.out.println("守护线程执行:" + i);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        //设置为守护线程
        t.setDaemon(true);
        //启动线程
        t.start();
    }
}

结论:JVM会等待所有的用户线程执行完再自然退出,但JVM不会等待守护线程执行完再退出。若用户线程没执行完强制退出,JVM也会退出。

线程的类型和线程的调度无关,只有线程的优先级和线程的调度有关。

6.是否存活

简单的理解为 run ⽅法是否运⾏结束了。

public class ThreadDemoByAlive {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
           Thread thread = Thread.currentThread();
            System.out.println("线程是否存活2:" + thread.isAlive());
        });
        System.out.println("线程是否存活:" + t.isAlive());
        t.start();
        System.out.println("线程是否存活3:" + t.isAlive());
        Thread.sleep(1000);
        System.out.println("线程是否存活4:" + t.isAlive());
    }
}

使用场景:

public class ThreadDemoByAlive {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("1:线程执行完了!");
        });
        t.start();
        while(t.isAlive()){
        }
        System.out.println("2:确认线程执行完了!");
    }
}

7.是否被中断

线程在休眠或执行当中,其他线程可以操作此线程让其中断。

PS:线程执行顺序or随机判断准则

  1. 在一个线程里的执行顺序是从上往下的。
  2. 多个线程之间的执行是随机的,因为线程调度是随机的。
public class ThreadDemo13 {
    public static void main(String[] args) throws InterruptedException {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                //得到执行当前任务的线程
                Thread t = Thread.currentThread();
                //打印线程id(是long类型)
                System.out.println(t.getName() + "——线程ID:" + t.getId());//①
                //打印线程名称
                System.out.println(t.getName() + "——线程名称:" + t.getName());//②
                //打印线程优先级
                System.out.println(t.getName() + "——线程优先级:" + t.getPriority());//③
            }
        };

        Thread thread = new Thread(runnable,"线程1");
        thread.start();

        Thread thread2 = new Thread(runnable,"线程2");
        thread2.start();

        Thread thread3 = new Thread(runnable,"线程3");
        thread3.start();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/352515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基础篇(-1)-java特点、JDK、JRE、JVM区别、字节码编译、跨平台、程序运行

文章目录1.Java的特点有哪些&#xff1f;2.JDK和JRE和JVM的区别3.Java为什么采用字节码编译&#xff1f;4.什么是跨平台&#xff1f;5.Java程序从源代码到运行需要三步&#xff1f;1.Java的特点有哪些&#xff1f; Java是一种编程语言&#xff0c;被特意设计用于互联网的分布式…

windwos安装spring-cloud-alibaba-nacos

windwos安装spring-cloud-alibaba-nacos前言一、预备环境二、下载源码或者安装包1.启动2.关闭总结前言 这个快速开始手册是帮忙您快速在您的电脑上&#xff0c;下载、安装并使用 Nacos。 一、预备环境 Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos&#x…

[ vulhub漏洞复现篇 ] Drupal Core 8 PECL YAML 反序列化任意代码执行漏洞(CVE-2017-6920)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Django框架进阶版

一、Django介绍 1.起源 2005年发布&#xff0c;采用python语言编写的。 早期Django主要做新闻和内容管理 重量级python web框架&#xff0c;配备了大量组件 2.组件 包含组件如下 基本配置文件/路由系统 MTV设计模式 Cookies和Session 分页和发邮件 Admin管理后台 3…

2023美赛A题完整数据!思路代码数据数学建模

选取内蒙古河套灌区&#xff08;典型干旱区&#xff09;2010-2020年气温&#xff0c;降雨&#xff0c;蒸散发和水汽压月数据 包括四种主要作物及其占比 内容截图如下&#xff1a; 链接为&#xff1a;https://www.jdmm.cc/file/2708703 同时还提供参考代码和参考文章的选项~…

格式化字符串

组包&#xff1a;按照需要的格式组成字符串解包&#xff1a;解析特定格式的数据网络信息传输解析字符串的格式使用较多&#xff01;1、sprintf用于组包将零散的数据格式按照固定的格式组成字符串#include <stdio.h> int sprintf(char *str, const char *format, ...); …

博客排名的影响是什么? 说明优点、注册方法和推荐网站

如果您经营博客&#xff0c;您是否在博客排名网站上注册&#xff1f;博客排名网站是以排名格式介绍各种注册博客的网站。如果您注册博客&#xff0c;您将有更多机会被人们看到&#xff0c;并且可以期望增加访问权限。对于那些刚刚打开博客并担心访问量不会轻易增加的人来说&…

王道考研——计算机网络(第一章 计算机网络体系结构)

1.0认识计算机网络 在下载电影&#xff08;不会出现乱序问题&#xff09;和微信收发消息&#xff08;比如表情包乱序了&#xff09;所使用的协议是不同的 1.1-1概念和功能 &#xff08;1&#xff09;计算机网络的概念 &#xff08;2&#xff09;计算机网络的功能 &#xff08;…

酸回收树脂的应用

酸洗废水 在轧钢、金属表面处理、电子元件制造等过程中需要清除钢材表面氧化铁皮而使用酸进行酸洗&#xff0c;酸洗过程中会产生废酸液和酸洗废水。 这些废酸产量大、酸度高&#xff0c;而且由于酸洗废水来自钢铁和金属表面处理的清洗水&#xff0c;水中含有多种重金属离子&am…

2023年美赛F题

关键点1.绿色GDP(GGDP)是否比传统GDP更好好的衡量标准?2.如果GGDP成为经济健康的主要量标准&#xff0c;可能会对环境产生什么影响?3建立一个简单的模型&#xff0c;估计GGDP取代GDP作为经济健康的主要衡量标准&#xff0c;对减缓气候变化产生的影响。4.GGDP取代GDP可能会遇到…

复旦-华盛顿大学EMBA项目二十年20人丨赵中华:“拓荒”新天地

复旦大学-华盛顿大学EMBA项目20周年校友系列访谈。      从业十八载&#xff0c;赵中华的身上始终葆有一种开拓创新的拼劲和韧劲。身为德国威卡集团计量校准事业部中国区销售总监&#xff0c;他认为无论是在开辟新市场时勇敢接受不确定性带来的挑战&#xff0c;还是在遭遇新…

打印不同的图形-课后程序(JAVA基础案例教程-黑马程序员编著-第四章-课后作业)

【案例4-1】打印不同的图形 记得 关注&#xff0c;收藏&#xff0c;评论哦&#xff0c;作者将持续更新。。。。 【案例介绍】 案例描述 本案例要求编写一个程序&#xff0c;可以根据用户要求在控制台打印出不同的图形。例如&#xff0c;用户自定义半径的圆形和用户自定义边长的…

MyBatis-Plus快速入门篇

入门篇1.快速入门1.1数据库准备1.2创建SpringBoot工程&#xff0c;引入MyBatis-Plus和MySQL依赖&#xff0c;可以使用 Spring Initializer快速初始化一个 Spring Boot 工程1.3编写DataSource相关配置&#xff08;配置MySQL数据库连接&#xff09;1.4编码1.5测试2.使用MybatisPl…

【论文阅读】Frustratingly Simple Few-Shot Object Detection

从几个例子中检测稀有物体是一个新出现的问题。 先前的工作表明Meta-Learning是一种有希望的方法。 但是&#xff0c;微调技术很少引起注意。 我们发现&#xff0c;在稀有类上只对现有探测器的最后一层进行微调对于 Few-Shot Object Detection至关重要。 这样一种简单的方法在当…

Yaklang XSS 检测启发式算法(被动扫描插件)

背景 上一篇介绍了XSS 启发式检测基础设施&#xff0c;本篇通过yak提供的基础设施编写一个xss检测插件。 本次xss靶场使用pentesterlab的xss靶场。 环境部署 git clone https://github.com/yaklang/vulinone cd php-web-for-pentester docker-compose up -d编写思路 参考上…

matlab-汽车四分之一半主动悬架模糊控制

1、内容简介汽车四分之一半主动悬架模糊控制651-可以交流、咨询、答疑2、内容说明半主动悬架汽车 1/4 动力学模型建立 本章主要对悬架类型进行简要介绍&#xff0c;并对其进行对比分析&#xff0c;提出半主动悬架的优越性&#xff0c;论述半主动悬架的工作原理&#xff0c;并对…

语音播报警示器技术要求

功能概述&#xff1a; 本系统采用30W太阳能板给12AH铅酸胶体电池充电&#xff1b;通过人体红外探测传感器&#xff0c;能感应到12米范围内有人有车经过&#xff0c;就触发播报防火宣传的语音&#xff0c;并且大红闪灯同步闪烁警示&#xff1b;高清双侧宣传牌&#xff0c;宣传内…

XSS注入基础入门篇

XSS注入基础入门篇1.XSS基础概念2. XSS的分类以及示例2.1 反射型XSS2.1.1 示例1&#xff1a;dvwa low 级别的反射型XSS2.1.2 攻击流程2.2 DOM型XSS2.2.1 示例2&#xff1a;DOM型XSS注入1.环境部署2.基础版本3.进阶绕过2.3 存储型XSS2.3.1 示例1&#xff1a;dvwa low示例2.3.2 攻…

WebADI - 参数的使用

* 本文仅供交流分享&#xff0c;不作为专业指导 最近研究了一下WEBADI文档下载的参数&#xff0c;由于网上这块资料较少&#xff0c;所以专意分享下我的笔记。 准备 集成器&#xff1a;BHSC_EMP_ADI 表值集&#xff1a;BHSC_DEPT_LOV&#xff08;值&#xff1a;dname&#x…

c++学习笔记-提高编程-模板(哔站-黑马程序员c++教学视频)

目录 1、模板概念 2、模板特点 3、模板语法 3.1编程思想&#xff1a;泛型编程 3.2两种模板方法&#xff1a; 3.2.1 函数模板 3.2.2 类模板 1、模板概念 通用的模具&#xff0c;提高代码复用性 2、模板特点 不可以直接使用&#xff0c;只是一个框架&#xff1b;模板的…