Java之线程篇二

news2024/11/15 13:52:48

目录

Thread的常见构造方法

Thread的常见属性

代码示例1

代码示例2

示例代码3

代码示例4

代码示例5

小结

线程中断

代码示例1

代码示例2

代码示例3

代码示例4

小结

线程等待

获取当前线程的引用


Thread的常见构造方法

举例

Thread t1 = new Thread();
Thread t2 = new Thread(new MyRunnable());
Thread t3 = new Thread("这是我的名字");
Thread t4 = new Thread(new MyRunnable(), "这是我的名字");

代码示例

public class Demo06 {
    public static void main(String[] args) {
        Thread t=new Thread(()->{
            while(true){
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        },"这是新线程");

        t.start();
    }
}

通过jconsole.exe观察

Thread的常见属性
属性获取方法
IDgetId()
名称getName()
状态getState()
优先级getPriority()
是否后台进程isDaemon()
是否存活isAlive()
是否被中断isInterrupted()

ID 是线程的唯一标识,不同线程不会重复;
名称是各种调试工具用到;
状态表示线程当前所处的一个情况;
优先级高的线程理论上来说更容易被调度到;
关于后台线程,记住一点:JVM会在一个进程的所有非后台线程结束后,才会结束运行;
是否存活,即简单的理解,为 run 方法是否运行结束了

代码示例1
public class Demo06 {
    public static void main(String[] args) {
        Thread t=new Thread(()->{
            while(true){
                System.out.println("hello thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        },"这是新线程");

        System.out.println(t.getId());
        System.out.println(t.getName());
        System.out.println(t.getState());
        System.out.println(t.getPriority());
        System.out.println(t.isDaemon());
        System.out.println(t.isAlive());
        System.out.println(t.isInterrupted());
        t.start();
    }
}

运行结果

代码示例2
public class Demo07 {
    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            System.out.println("线程开始");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("线程结束");
        });

        System.out.println(t.isAlive());
        t.start();
        System.out.println(t.isAlive());
        Thread.sleep(3000);
        System.out.println(t.isAlive());
    }
}

运行结果

示例代码3
public class Demo08 {
    private static boolean isQuit=false;
    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            while(!isQuit){
                System.out.println("线程工作中");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("线程工作完毕!");
        });

        t.start();
        Thread.sleep(5000);
        isQuit=true;
        System.out.println("设置 isQuit 为 true");
    }
}

运行结果

代码示例4
public class Demo09 {
    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            //Thread类内部有一个标志位,可以用来判定当前的循环是否要结束
            while(!Thread.currentThread().isInterrupted()){
                System.out.println("线程工作中");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    //throw new RuntimeException(e);
                    //1.假装没听见,循环继续正常执行
                    e.printStackTrace();
                    //2.加上一个bread,表示让线程立即结束
                    //break;
                    //3.做一些其它工作,完成之后再结束
                    break;
                }
            }
        });
        t.start();

        Thread.sleep(5000);
        System.out.println("让 t 线程终止");
        t.interrupt();
    }
}

运行结果

代码示例5
public class Demo10 {
    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            for (int i = 0; i < 5; i++) {
                System.out.println("t 线程工作中");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        t.start();
        
        System.out.println("join 等待开始");
        t.join();
        System.out.println("join 等待结束");
    }
}
小结

上面的代码是让主线程来等待 t 线程执行结束,一旦调用 join,主线程就会触发阻塞,此时 t 线程就可以趁机完成后续的工作,一直到阻塞到 t 执行完毕,join才会解除阻塞。

即:哪个线程调用 join(),哪个线程就会被阻塞。

代码示例6

public class Demo11 {
    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            while(true){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        System.out.println(t.getState());
        t.start();

        for (int i = 0; i < 5; i++) {
            System.out.println(t.getState());
            Thread.sleep(1000);
        }

        System.out.println(t.getState());
    }
}

 运行结果

线程中断

常见的两种方式:

1.通过共享的标记来进行沟通;

2.调用 interrupt() 方法来通知。

代码示例1
public class Demo11 {
    private static class MyRunnable implements Runnable{
        public volatile boolean isQuit=false;

        @Override
        public void run() {
            while(!isQuit) {
                System.out.println("开始");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("结束");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        MyRunnable target=new MyRunnable();
        Thread t=new Thread(target);
        t.start();
        Thread.sleep(5000);
        target.isQuit=true;
    }
}

运行结果

代码示例2
public class Demo11 {
    private static class MyRunnable implements Runnable{
        @Override
        public void run() {
            while(!Thread.interrupted()) {
                System.out.println("开始");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("结束");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        MyRunnable target=new MyRunnable();
        Thread t=new Thread(target);
        t.start();
        Thread.sleep(5000);
        t.interrupt();
    }
}

运行结果

代码示例3
public class Demo11 {
    private static class MyRunnable implements Runnable{
        @Override
        public void run() {
            while(true){
                System.out.println(Thread.currentThread().isInterrupted());
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        MyRunnable target=new MyRunnable();
        Thread t=new Thread(target);
        t.start();
        Thread.sleep(2000);
        t.interrupt();
    }
}

 运行结果

代码示例4
public class Demo11 {
    private static class MyRunnable implements Runnable{
        @Override
        public void run() {
            while(true){
                System.out.println(Thread.interrupted());
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        MyRunnable target=new MyRunnable();
        Thread t=new Thread(target);
        t.start();
        Thread.sleep(2000);
        t.interrupt();
    }
}

运行结果

小结

如果线程因为调用wait/join/sleep等方法而阻塞挂起,则以InterruptedException异常的形式通知,清除中断标志,当出现InterruptedException的时候,要不要结束线程取决于catch中代码的写法,可以选择忽略这个异常,也可以选择跳出循环结束线程;

1.Thread.interrupted()判断当前线程的中断标志被设置,清除中断标志;

2.Thread.currentThread().isInterrupted()判断指定线程的中断标志被设置,不清楚中断标志;

这两种方法通知收到的更及时,及时线程正在sleep也可以马上收到。

线程等待

获取当前线程的引用
方法属性
public static Thread currentThread()返回当前线程对象的引用

    public class ThreadDemo {
        public static void main(String[] args) {
            Thread thread = Thread.currentThread();
            System.out.println(thread.getName());
        }
    }

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

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

相关文章

YOLOv8改进 | 融合改进 | C2f融合Faster模块提升检测速度【完整代码 + 主要代码解析】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

conda环境安装与删除

安装 1.cmd安装 conda create -n xxxxx(名字) python3.8 进入虚拟环境 activate xxxxx(名字) 查看虚拟环境的库 pip list 退出虚拟环境 deactivate 2.pycharm直接创建 对一个项目右下角&#xff1a; 可以使用现有环境&#xff0c;也可以创建新环境 删除 在cmd中输入&…

大模型在安全领域的十大应用场景及实现路径

作为网络安全及AI的双重爱好者&#xff0c;笔者也一直在关注大模型在安全领域的相关应用&#xff0c;从目前市面上看到的产品来说&#xff0c;相关的结合还在一个较为早期的阶段&#xff0c;很多产品能力也是为了大模型而大模型&#xff0c;并未真正发挥其价值。 在去年上一篇相…

lvgl 滚轮roller 选项循环设置

lvgl 中可以通过设置滚轮的属性使所有选项循环出现&#xff0c;对于时间、日期之类的组件非常实用。 lv_roller_set_options(lv_obj_t * obj, const char * options, lv_roller_mode_t mode)&#xff1b; 这个函数的最后一个参数有两个值&#xff1a; LV_ROLLER_MODE_NORMAL…

大模型面经——Langchain总结

本篇介绍Langchain相关面试题。 本次将会分为上下两个部分&#xff0c;本篇章将会介绍前三个问题&#xff0c;下一次在将后三个问题补充完毕。 以下是一个快捷目录&#xff1a; 什么是 LangChain? LangChain 包含哪些部分&#xff1f; LangChain 中 Chat Message History …

49、Python之模块和包:模块导入对命名空间的影响

引言 前面文章中&#xff0c;关于Python解释器在模块导入行为背后所执行的操作&#xff0c;已经做了深入的介绍。本文打算在此基础上&#xff0c;结合实际代码案例&#xff0c;进行进一步的补充说明。同时&#xff0c;比较看似只是微小的导入方式的改变&#xff0c;可能会导致…

「ComfyUI」生图修图神器,自定义调节颜色光暗,更生动更强对比度生图技巧分享!

前言 ‍‍‍‍‍前 言 今天再给小伙伴们分享一个简单又实用生图神器插件&#xff0c;可以调整整个图像的光暗变化以及颜色变化。 原理的话&#xff0c;我们也简单来说下&#xff0c;我们在使用 VAE 将图像编码为潜在噪声时&#xff0c;VAE 解码的值通常在一定范围内&#xf…

在Mac上打开UE4Editor

编译MacEditor 使用如下命令在Mac机器上编译Mac的UE4Editor&#xff1a; ${EnginePath}/Engine/Build/BatchFiles/Mac/Build.sh ${ProjectName}Editor Mac Development ${ProjectPath} -buildubt -buildscw -waitmutex -log${ClientPath}/Saved/Logs/${ProjectName}Editor.log…

SpringBoot集成kafka-自定义拦截器(可以在拦截器中做记录日志、安全检查等操作)

TOC 1、kafka配置类 kafka配置类添加Configuration注解&#xff0c;springboot启动后会自动读取该配置类&#xff1b;由于在application.yml文件中我们找不到kafak拦截器相关的配置项&#xff0c;因此需要自定义拦截器&#xff1b;消费者相关配置方法中添加自定义拦截器配置&a…

FORTIFY: FD_ISSET: file descriptor 1024 >= FD_SETSIZE 128 记录

问题 在开发过程中&#xff0c;遇到一个问题&#xff0c;即使用FD_ISSET时&#xff0c;当文件描述符数量超过1023&#xff0c;导致netd进程出现crash。通过代码和log分析&#xff0c;发现这是由于内核限制导致的数组越界问题。 总结&#xff1a;FD_ISSET(sock, &read_fds)…

【日记】这个月花了好多钱(1317 字)

正文 这几天都好热。热到人不想动&#xff0c;只想睡觉。 今天写文章发现自己有个很显著的特点&#xff0c;就是在有个框架之后&#xff0c;具体细节完全没有预设。我只能像马尔可夫链一样&#xff0c;形成一个比较窄的窗口&#xff0c;接着这个窗口里的情节往下写&#xff0c;…

.NET Razor类库 - 生成NuGet包

上一篇讲了Razor类库组件化&#xff1a;https://blog.csdn.net/CsethCRM/article/details/141558974 本篇说一下Razor类库生成NuGet包 1.右键Razor类库项目 - 属性 2. 输入Nuget 包信息 点击 左侧菜单 包 在生成操作期间 创建包文件 打勾 版本号 我们输入 2023.1.0 作者 Xxx…

外卖霸王餐项目是什么?怎么搭建属于自己的外卖霸王餐小程序 ?

前言&#xff1a; 外卖霸王餐项目是一种结合了优惠促销与推广合作的商业模式&#xff0c;主要针对外卖行业。这个项目的核心是通过提供低于市场价的外卖餐品&#xff08;通常是半价或者更大折扣&#xff09;来吸引新用户尝试&#xff0c;并通过用户的口碑传播来增加餐厅的知名…

降本高达30%,磁集成是电源企业的福音吗?

导语 为什么说磁集成将会是大功率电源产品趋势?因为终端价格战越来越激烈&#xff0c;只有磁集成才能同时解决电源企业的三大核心竞争需求。 终端持续“卷”价格 储能价格正式步入0.5元时代。从价格战的角度来看&#xff0c;储能领域自2023年起就已经进入“0.5元/Wh时代”&…

集群 NAT(地址转换)、TUN(IP隧道)、DR(直接路由)

一、企业群集应用概述 1、群集的含义 ①、Cluster、集群、群集 ②、由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供一个访问入口&#xff08;域名与IP地址&#xff09;&#xff0c;相当于一台大型计算机。 2、问题 ①、互联网应用中&#xff0c;随着站…

composer常用命令列表和实践使用、服务器lnmp环境自动化部署脚本及netstat命令常用选项笔记-及state各值的意义

一、composer常用命令列表和实践使用 1. composer常用的命令列表如下&#xff1a; #. composer install 命令&#xff08;composer.lock与composer.json&#xff09; 如果当前目录下存在composer.lock文件&#xff0c;则从此文件读取依赖版本&#xff0c;否则就读取compose…

计算机毕业设计选题推荐-社区康养管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

SQL注入漏洞WAF绕过

目录 如何检测和防范SQL注入攻击中的编码伪装&#xff1f; 检测SQL注入攻击中的编码伪装 防范SQL注入攻击中的编码伪装 WAF在处理SQL注入时为什么有时会对大小写不敏感&#xff1f; SQL注入中的联合查询注入有哪些常见的攻击方式&#xff1f; 在绕过Web应用防火墙&#xf…

软件工程造价师习题练习 22

1.公文管理系统可以设置公文处理提示的方式和频率。系统缺省设置为邮件方式及每天提醒。则对于公文管理系统,“公文处理提示方式及频率的缺省设置信息”配置信息缺省默认值是业务数据。 正确 错误 要判断“公文处理提示方式及频率的缺省设置信息”配置信息缺省默认值是否是业务…

Nginx 反向代理实现 Tomcat 高可用性负载均衡详解

Tomcat 简介 Tomcat是Apache软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun和其他一些公司及个人共同开发而成。 Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务…