Java之线程相关应用实现

news2024/11/19 5:41:16

后台线程

一个进程中只有后台进程运行,该进程将会结束。

新创建的线程默认为前台线程,Java中只要有一个前台线程运行,就不会结束程序,如果只有后台线程运行,程序就会结束,可以在线程对象启动前执行setDaemon(true)语句设置该线程为后台线程。

class Main {
    public static void main(String[] args) {
        System.out.println("main()线程是后台线程吗"+Thread.currentThread().isDaemon());
        DaemonThread daemon=new DaemonThread();
        Thread thread=new Thread(daemon,"后台线程");
        System.out.println("Daemons是后台线程吗"+thread.isDaemon());
        thread.setDaemon(true);//设置为后台线程
        System.out.println("Daemons是后台线程吗"+thread.isDaemon());
        thread.start();
        //模拟主线程main执行
        int i=0;
        for(;i<3;i++){
            System.out.println(i);
        }
    }
}

class DaemonThread implements Runnable {
    //模拟分线程执行
    public void run(){
        while(true){
            System.out.println(Thread.currentThread().getName()+"正在运行");
        }
    }

}

657dcc7e398d43e38c6b0ba9dc153ec7.png

线程的优先级

使用setPriority方法,设置优先级为1到10;数字越大,优先级越高,获得CPU的使用权机会越大。

class Main {
    public static void main(String[] args) {
        Thread minPriority =new Thread(new maxpriority(),"优先级较高线程");
        Thread maxPriority=new Thread(new minpriority(),"优先级较低线程");
        minPriority.setPriority(Thread.MIN_PRIORITY);//设置优先级为1
        maxPriority.setPriority(Thread.MAX_PRIORITY);//设置优先级为10
        //开启两个线程
        minPriority.start();
        maxPriority.start();
    }

}
class maxpriority implements Runnable{
    public void run(){
        for(int i=0;i<3;i++) {
            System.out.println(Thread.currentThread().getName() + "正在输出" + i);
        }
    }

}
class minpriority implements Runnable{
    public void run(){
        for(int i=0;i<3;i++) {
            System.out.println(Thread.currentThread().getName() + "正在输出" + i);
        }
    }
}

82ba89d33e6e405e95cba44fcd8189dd.png

线程休眠

当前线程暂停运行,进入阻塞状态哦使用sleep()方法。传入参数单位为毫秒。

sleep调用时,只能让当前正在运行的线程休眠,

class Main {
    public static void main(String[] args) {
        new Thread(new Sleepthread()).start();//开启新线程

        for(int i=1;i<=8;i++){
            try{  if(i==5){
                Thread.sleep(1000);
            }
                System.out.println("主线程正在输出"+i);
                Thread.sleep(500);}
            catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }

}
class Sleepthread implements Runnable{

    public void run(){
        for(int i=1;i<=8;i++){

            if(i==3){
                try{
                    Thread.sleep(1000);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
            System.out.println("Sleep线程正在输出"+i);
            try{ Thread.sleep(500);}
            catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}

72f75bcac65e4cd098521426f08758bf.png

主线程在Sleep线程输出3之前连续输出2,3,4;说明此时Sleep线程在输出值3时先休眠了一段时间;

另外,Sleep线程再输出6之前,主线程也连续输出5,6;说明此时Sleep在输出6时休眠了一段时间。

线程插队

class Main {
    public static void main(String[] args) throws Exception {
        Thread thread=new Thread(new Joinrunable(),"thread");
        thread.start();
        for(int i=1;i<=4;i++){
            if(i==2){
                thread.join();//调用join()方法插队实现
            }
            System.out.println(Thread.currentThread().getName()+"线程正在输出"+i);
        }
    }
}
class Joinrunable implements Runnable{

    public void run(){
        for(int i=1;i<=3;i++){

            System.out.println(Thread.currentThread().getName()+"线程正在输出"+i);
        }
    }
}

main()线程和thread线程互相争夺CPU使用权,然后当i=3时候

711040d214f34ed2acffaabc7efe4b8f.png

线程生命周期的六种基本状态

(1)新建状态

创建一个线程对象后,还没有调用start()方法启动之前的状态

(2)可运行状态

就绪状态,调用了start()方法之后进入的状态。

(3)锁阻塞状态

当一个线程想要获取一个对象锁,该aii锁被其他线程持有,该线程进入锁阻塞状态。

(4)无限等待状态

一个线程等待另一个线程执行一个唤醒动作,该线程进入的状态。

(5)计时等待状态

具有指定等待时间的状态,一直保持到超时或被唤醒

(6)被终止状态

终止运行,由于正常退出或者异常没有被捕获而结束。

线程让步

某个特定时间点,线程暂停抢夺CPU,采用yield()方法实现。

class Main {
    public static void main(String[] args) throws Exception {
        //新建两个线程
        Thread th1=new Fieldthread("th1");
        Thread th2=new Fieldthread("th2");
//开启两个线程
        th1.start();
        th2.start();
    }
}
class Fieldthread extends Thread {
    public Fieldthread(String name) {
        super(name);//调用父类带参构造方法
    }
    public void run() {
        for(int i=1;i<4;i++){
            System.out.println(Thread.currentThread().getName()+"线程输出"+i);
            if(i==2){
                System.out.println("线程让步");
                //线程让步
                Thread.yield();
            }

        }
    }
}

2b1eac01d6a24dea91c6889045062b69.png

线程中断

调用两种方法实现:

interrupt()方法和isInterrupted()方法

isInterrupted方法判断中断标志位,如果为真表示中断。

class Main {
    public static void main(String[] args) throws Exception {
        Thread thread=new Thread(
                new Runnable() {
                    public void run() {
                        for (int i = 0; i < 4; i++) {
                            if(i==2){
                                Thread.currentThread().interrupt();
                                System.out.println("线程是否中断"+Thread.currentThread().isInterrupted());
                            }
                        }
                    }
                }
        );//创建实例对象
        thread.start();//启动线程

    }
}

e3190bf4c7c54f79b853a47a30295c46.png

线程同步

class Main {
    public static void main(String[] args) throws Exception {
        Salethread salethread = new Salethread();
        new Thread((salethread),"线程1").start();//创建并启动新线程
        new Thread((salethread),"线程2").start();//创建并启动新线程
        new Thread((salethread),"线程3").start();//创建并启动新线程
    }
}
class Salethread implements  Runnable{
    private int tickets=10;
    public void run(){
        while(tickets>0){
            try{
                Thread.sleep(300);
            }catch(Exception e){
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"卖出票号是 "+tickets--);
        }

    }
}

2b0ba6ab35a341238fa1692dfe1ad67c.png

结果的票数中出现了0;之所以这样是因为每个线程都会先调用sleep方法进入休眠一段时间。即假设票数为3时候,线程2先进入while循环,然后调用sleepf方法休眠一段时间,在此期间票数值不变,因为票数只有在最后输出时候才会减少,线程3进入while循环,然后调用sleep()方法休眠一段时间,于此同时然后线程1进入while循环,然后调用sleep()方法进入休眠,最后三个线程依次结束休眠状态,相继售票,即票数由3变化到0;

所以为了安全起见,使用同步代码块,使得多线程访问处理同一资源时候,任何时刻只能由一个线程访问处理。

将共享资源的代码放在synchronized(lock)关键字修饰的代码块中。

synchronized(lock){

处理共享资源的代码块

}

lock是指锁,即某个线程执行时,其他线程不能执行。

class Main {
    public static void main(String[] args) throws Exception {
        Salethread salethread = new Salethread();
        new Thread((salethread),"线程1").start();//创建并启动新线程
        new Thread((salethread),"线程2").start();//创建并启动新线程
        new Thread((salethread),"线程3").start();//创建并启动新线程
    }
}
class Salethread implements  Runnable{
    private int tickets=10;
    Object lock=new Object();//定义锁
    public void run(){
        while(tickets>0){
            synchronized (lock) { try{
                Thread.sleep(300);
            }catch(Exception e){
                e.printStackTrace();
            }
                if(tickets>0){ System.out.println(Thread.currentThread().getName()+"卖出票号是 "+tickets--);}
                else{
                    break;
                }}

        }

    }
}

f01c0b6c07384ee580bb81a3934cbf28.png

同步方法

 

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

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

相关文章

工业AIoT竞赛流程

不要点到重置&#xff01;&#xff01;&#xff01;要刷新虚拟机就点重启 xshell连接虚拟机&#xff1a;ssh rootPublic IP 环境构建 vim /etc/hosts 按 i 进入插入模式&#xff0c;加内网ip和主机名&#xff0c;按esc&#xff0c;按 : &#xff0c;按wq 三个虚拟机都这样配 …

HQChart使用教程30-K线图如何对接第3方数据41-分钟K线叠加股票增量更新

HQChart使用教程30-K线图如何对接第3方数据40-日K叠加股票增量更新 叠加股票叠加分钟K线更新Request 字段说明Data.symbol 协议截图返回json数据结构overlaydata HQChart代码地址交流 叠加股票 示例地址:https://jones2000.github.io/HQChart/webhqchart.demo/samples/kline_i…

controller不同的后端路径对应vue前端传递数据发送请求的方式

目录 案例一&#xff1a; 为什么使用post发送请求&#xff0c;参数依旧会被拼接带url上呢&#xff1f;这应该就是param 与data传参的区别。即param传参数参数会被拼接到url后&#xff0c;data会以请求体传递 补充&#xff1a;后端controller 参数上如果没写任何注解&#xff0c…

半夜被慢查询告警吵醒,limit深度分页的坑

分享是最有效的学习方式。 博客&#xff1a;https://blog.ktdaddy.com/ 故事 梅雨季&#xff0c;闷热的夜&#xff0c;令人窒息&#xff0c;窗外一道道闪电划破漆黑的夜幕&#xff0c;小猫塞着耳机听着恐怖小说&#xff0c;辗转反侧&#xff0c;终于睡意来了&#xff0c;然而挨…

50、基于NARX神经网络的磁悬浮建模(matlab)

1、NARX神经网络简介 NARX&#xff08;非线性自回归外部输入&#xff09;神经网络是一种用于非线性建模和预测的神经网络结构。与传统的自回归模型不同&#xff0c;NARX网络可以接收外部输入来影响输出结果&#xff0c;从而更好地捕捉系统的复杂性和非线性特征。 NARX神经网络…

正版软件 | DeskScapes:将您的桌面变成生动的画布

您是否厌倦了静态的桌面背景&#xff1f;Stardock 的 DeskScapes 软件赋予您将任何图片或视频动画化的能力&#xff0c;让您的 Windows 桌面焕发活力。 动画桌面&#xff0c;艺术生活 使用 DeskScapes 您可以将任何静态图片或视频转化为桌面背景。不仅如此&#xff0c;通过 60 …

项目1111

中文显示姓名列和手机号 SELECT contact_name AS 姓名, contact_phone AS 手机号 FROM 2_公司id; 使用explain测试给出的查询语句&#xff0c;显示走了索引查询 EXPLAIN SELECT * FROM 7_订单数量 WHERE countid LIKE e%; 统计用户订单信息&#xff0c;查询所有用户的下单数量…

基于 GD32F450 的Zephyr 的基本测试-编译工程

一、cmake 编译 hello world 测试 打开示例工程 hello world cd ~/zephyrproject/zephyr/samples/hello_world新建 build 目前&#xff0c;用于存放临时文件目录&#xff0c;并进入该目录 mkdir -p build && cd build通过 cmake 指令 生成 gd32f450z 工程的 makefil…

Shell 编程入门

优质博文&#xff1a;IT-BLOG-CN 【1】x.sh文件内容编写&#xff1a; 固定开头&#xff1a;#&#xff01;/bin/sh&#xff1b; 【2】学习的第一个命令就是echo输出的意思&#xff1b; 【3】其实shell脚本也就是在文件中写命令&#xff0c;但是我们要写的是绝对路径&#xff1a…

k8s token加新节点

在 master 节点执行 kubeadm token create --print-join-command得到token和cert&#xff0c;这两个参数在2个小时内可以重复使用&#xff0c;超过以后就得再次生成 kubeadm join apiserver.k8s.com --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha…

C++ | Leetcode C++题解之第199题二叉树的右视图

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> rightSideView(TreeNode* root) {unordered_map<int, int> rightmostValueAtDepth;int max_depth -1;stack<TreeNode*> nodeStack;stack<int> depthStack;nodeStack.push(ro…

测试开发工程师需要掌握什么技能?

测试开发工程师是软件开发中至关重要的角色之一。他们负责编写、维护和执行自动化测试脚本、开发测试工具和框架&#xff0c;以确保软件的质量和稳定性。为了成为一名优秀的测试开发工程师&#xff0c;你需要掌握以下技能&#xff1a; 1. 编程技能&#xff1a; 作为测试开发工…

构建网络图 (JavaScript)

前序&#xff1a;在工作中难免有一些千奇百怪的需求&#xff0c;如果你遇到构建网络图&#xff0c;或者学习应对未来&#xff0c;请看这边文章&#xff0c;本文以代码为主。 网络图是数据可视化中实用而有效的工具&#xff0c;特别适用于说明复杂系统内的关系和连接。这些图表…

排序算法系列二:归并排序、快速排序

零、说在前面 本文是一个系列&#xff0c; 入口请移步这里 一、理论部分 1.4&#xff1a;归并排序 1.4.1&#xff1a;算法解读&#xff1a; 使用二分法和插入排序两种算法的思想来实现。流程分为“拆分”、“合并”两大部分&#xff0c;前者就是普通的二分思想&#xff0c;将…

文生视频模型Sora刷屏的背后的数据支持

前言&#xff1a;近日&#xff0c;OpenAI的首个文生视频模型Sora横空出世&#xff0c;引发了一波Sora热潮。与其相关的概念股连续多日涨停&#xff0c;多家媒体持续跟踪报道&#xff0c;央视也针对Sora进行了报道&#xff0c;称这是第一个真正意义上的视频生成大模型。 01 …

VisualRules组件功能介绍-计算表格(一)

一、本章内容 2、计算表格是什么 3、计算表格的比较优势 4、计算表格基本功能展示 5、计算表格基本操作 6、特别说明 二、计算表格是什么 计算表格作为VisualRules规则引擎的核心组件&#xff0c;提供了一种在内存中高效处理数据的方法。通过将外部数据导入计算表格&#x…

C++入门 list的模拟实现

目录 list的节点类 list的迭代器类 list的模拟实现 要模拟实现list&#xff0c;必须要熟悉list的底层结构以及其接口的含义&#xff0c;通过之前学习&#xff0c;这些内容已基本掌握&#xff0c;现在我们来模拟实现list。 参照带头双向循环链表的结构&#xff0c;我们可以建…

DVWA 靶场 File Upload 通关解析

前言 DVWA代表Damn Vulnerable Web Application&#xff0c;是一个用于学习和练习Web应用程序漏洞的开源漏洞应用程序。它被设计成一个易于安装和配置的漏洞应用程序&#xff0c;旨在帮助安全专业人员和爱好者了解和熟悉不同类型的Web应用程序漏洞。 DVWA提供了一系列的漏洞场…

1.x86游戏实战-认识CE

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提取码&#xff1a;6tw3 复…

ARCGIS添加在线地图

地图服务地址&#xff1a;http://map.geoq.cn/ArcGIS/rest/services 具体方法&#xff1a; 结果展示&#xff1a;