Java并发编程—线程详解

news2024/11/15 12:49:58

文章目录

  • 线程简介
    • 什么是线程
    • 多线程的使用
      • 什么时候需要使用多线程?
      • 写多少个线程比较合适?
    • 线程优先级
      • 靠谱的让出CPU的方法?
    • 线程的状态
      • 线程的状态有哪几种?
    • 线程的状态转换
    • Daemon线程
  • 启动和终止线程
      • 构造线程
      • 启动线程
      • 理解中断
      • 如何安全的终止线程
        • 直接调用interrupt会不会使线程中断?
  • 线程间通信
    • 等待/通知机制
  • 线程应用实例
    • 等待超时模式
    • CountDownLatch
        • countDownLatch代码

——————————————————————————————

线程简介

什么是线程

进程是由线程组成的
线程本质是一个栈

多线程的使用

什么时候需要使用多线程?

  1. 在cpu产生浪费时,需要性能提升的时候
  • cpu什么时候产生浪费比较严重?
    • 网络IO、磁盘IO的时候浪费比较严重
    • 网络IO:网络请求数据,在数据回来之前cpu一直在打空转
    • 磁盘IO:向磁盘发出调度,等数据回来也是cpu一直在打空转
  1. 需要同时运行多个线程

写多少个线程比较合适?

一般是二十四十个线程比较合适(回答的时候答2040之间的具体一个数),一方面因为CPU有上下文切换,消耗时间;另一方面读写数据库单批次数据不能太大,太大会影响数据库的性能

线程优先级

下面代码,设置5个高优先级,5个低优先级,让10个线程处于就绪态,一起竞争资源,谁的count越大,谁竞争到的次数越多(优先级高的,竞争到的次数应该高)。
但是结果是,高优先级和低优先级count结果一样,说明设置的优先级没用

public class Priority {
    private static volatile boolean notStart = true;//为true,在29行的循环才能执行
    private static volatile boolean notEnd = true;//为true,在35行的循环才能执行
    public static void main(String[] args) throws Exception {
        List<Job> jobs = new ArrayList<Job>();
        for (int i = 0; i < 10; i++) {
            int priority = i < 5 Thread.MIN_PRIORITY : Thread.MAX_PRIORITY;
            Job job = new Job(priority);
            jobs.add(job);
            Thread thread = new Thread(job, "Thread:" + i);
            thread.setPriority(priority);
            thread.start();
        }
        notStart = false;//10个线程进入就绪态之后,notStart变为true,每个线程进入就绪态后都会进入第二个循环执行++操作
        TimeUnit.SECONDS.sleep(10);//10个线程竞争了10秒钟,在这之前会让jobCount++
        notEnd = false;
        for (Job job : jobs) {
            System.out.println("Job Priority : " + job.priority + ",
            Count : " + job.jobCount);
        }
    }
    static class Job implements Runnable {
        private int priority;//私有的,int类型的优先级
        private long jobCount;//工作次数
        public Job(int priority) {//指定这一次运行的优先级
            this.priority = priority;
        }
        public void run() {
            while (notStart) {//如果notStart为true,一直执行这个循环
            //先进入就绪态的线程,先执行的概率比较大
                 hread.yield();//保证了公平
            //因为进入了运行状态但是没真正执行++操作,只是打空转后让出cpu
            //让出后重新进入就绪态,是操作系统记录位置,不是程序计数器
            }
            while (notEnd) {
                Thread.yield();//这句话是让出cpu的意思
                //为什么要加上这个(因为这个方法不靠谱,并不能立刻让出cpu,cpu会执行一段之间)
                //这个让出cpu后,会执行下面的++操作
                jobCount++;
            }
        }
    }
}

在这里插入图片描述
count数字这么大,也表示Thread.yield();方法不靠谱,并不是执行一次++操作就让出cpu,可能执行了1000次或10000次才让出cpu。

靠谱的让出CPU的方法?

sleep(0)或sleep(1):可以立刻让出cpu

线程的状态

线程的状态有哪几种?

**线程状态:**新建状态,就绪状态,运行状态,阻塞状态,等待状态,终止状态(死亡状态)。

  • 新建状态:线程被构建,但是还没有调用start()方法
  • 就绪状态:调用了start()方法,还没开始运行
  • 运行状态:开始运行后,的运行时期
  • 阻塞状态:(是加锁竞争失败的)当几个线程同时竞争资源,竞争失败的线程全部进入阻塞状态,当竞争成功的线程释放锁的时候,会通知进入阻塞状态的线程,他们才会重新进入运行状态竞争资源。(如果是轻量级锁会自旋,能主动能够知道资源被释放了,而重量级锁无法知道资源什么时候释放,需要有人通知他)
  • 等待状态:调用 wait() 或sleep()方法,调用 wait()需要事先加锁
  • 终止状态(死亡状态):线程执行结束,被回收
    在这里插入图片描述

线程的状态转换

在这里插入图片描述

Daemon线程

  • 是一种守护线程,Daemon线程是一种支持型线程,因为它主要被用作程序中后台调度以及支持性工作。
  • 做辅助性的线程
  • Daemon属性需要在启动线程之前设置,不能在启动线程之后设置

启动和终止线程

通过调用线程的start()方法进行启动,随着run()方法的执行完毕,线
程也随之终止

构造线程

在运行线程之前首先要构造一个线程对象,线程对象在构造的时候需要提供线程所需要
的属性
==》如线程所属的线程组、线程优先级、是否是Daemon线程等信息(设置线程的父线程等)
==》可以通过构造方法加属性,也能通过其他方法加属性。

启动线程

调用start()方法就可以启动这个线程。

  • 启动一个线程前,最好为这个线程设置线程名称,因为这样在使用jstack分析程
    序或者进行问题排查时,就会给开发人员提供一些提示,自定义的线程最好能够起个名字。

理解中断

中断好比其他线程对该线程打了个招呼,其他线程通过调用该线程的interrupt()
方法对其进行中断操作。
如何安全的终止线程

如何安全的终止线程

直接调用interrupt会不会使线程中断?

其他线程想让线程中断,需要在该线程中写代码配合, 如果只单纯的有其他线程调用该线程的中断方法,是不起任何作用的。
线程内需要配合,才能使这个线程中断
在这里插入图片描述
线程通过方法isInterrupted()来进行判断是否
被中断,也可以调用静态方法Thread.interrupted()对当前线程的中断标识位进行复位。

线程间通信

等待/通知机制

一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个
过程开始于一个线程,而最终执行又是另一个线程。
简单的办法是让消费者线程不断地循环检查变量是否符合预期。
在这里插入图片描述
上面这段伪代码在条件不满足时就睡眠一段时间,这样做的目的是防止过快的“无效”尝
试。
1)难以确保及时性。
2)难以降低开销。
在这里插入图片描述
示例:
WaitThread和NotifyThread,前者检查flag值是否为false,如果符合要求,进行后续操作,否则在lock上等待,后者在睡眠了一段时间后对lock进行通知。
(等待状态不会进入竞争,阻塞状态会被唤醒后参与竞争)
在这里插入图片描述

线程应用实例

等待超时模式

前面的章节介绍了等待/通知的经典范式,即加锁、条件循环和处理逻辑3个步骤,而这种
范式无法做到超时等待
假设超时时间段是T,那么可以推断出在当前时间now+T之后就会超时。
定义如下变量:

  • 等待持续时间:REMAINING=T。
  • 超时时间:FUTURE=now+T。
    这时仅需要wait(REMAINING)即可,在wait(REMAINING)返回之后会将执行:
    REMAINING=FUTURE–now。如果REMAINING小于等于0,表示已经超时,直接退出,否则将
    继续执行wait(REMAINING)。
    在这里插入图片描述

CountDownLatch

CountDownLatch属于线程同步的一种,让线程同时执行
CountDownLatch功能:
使用了CountDownLatch来确保ConnectionRunnerThread能够同时开始执行,并
且在全部结束之后,才使main线程从等待状态中返回。

countDownLatch代码

在这里插入图片描述

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

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

相关文章

[附源码]计算机毕业设计基于Springboot的物品交换平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

逻辑回归模型和Python代码实现

文章目录逻辑回归原理sigmoid函数优化建模代码实现自编代码sklearn代码代码测试原理测试交叉验证逻辑回归原理 此前介绍的线性回归基本模型和增加了正则项的优化模型都只能用来预测连续值&#xff08;标签值是多少&#xff09;&#xff0c;如果想要应用于分类问题&#xff08;…

回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出

回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出 文章目录 回归预测 | MATLAB实现GRU(门控循环单元)多输入单输出预测效果基本介绍模型结构程序设计参考资料致谢预测效果 基本介绍 GRU神经网络是LSTM神经网络的一种变体,LSTM 神经网 络是在RNN的基础上发展起来的。RNN是一…

Python学习----网络编程

网络&#xff1a;网络就是实现资源共享和信息传递的虚拟平台&#xff0c;我们可以编写基于网络通信的程序。比如socket编程&#xff0c;web开发 Socket编程 Socket是程序之间通信的一个工具&#xff0c;好比显示生活中的电话&#xff0c;你知道了对方的电话号码之后&#xff…

RabbitMQ进阶

可以结合着狂神的RabbitMQ的笔记来进行学习 狂神说RabbitMQ笔记 RabbitMQ高级特性 消息可靠性投递 保证我发出的消息可以到达中间件&#xff0c;避免在传输的过程中发生丢失的情况。 这两个可靠性传输方式分别是负责不同的阶段&#xff0c;confirm是负责保证从生产者到队列…

[附源码]Python计算机毕业设计Django抗疫医疗用品销售平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

2023年江苏省职业院校技能大赛中职赛项规程样题

2023年江苏省职业院校技能大赛中职赛项规程 一、赛项名称 赛项编号&#xff1a;JSZ202335 赛项名称&#xff1a;网络安全 赛项组别&#xff1a;学生组、教师组 赛项归属专业大类&#xff1a;信息技术类 竞赛目的 贯彻落实《国家职业教育改革实施方案》《关于推动现代职业教…

设计模式——观察者模式

动机&#xff08;Motivation&#xff09; 在软件构建过程中&#xff0c;我们需要为某些对象建立一种“通知依赖关系” ——一个对象&#xff08;目标对象&#xff09;的状态发生改变&#xff0c;所有的依赖对象&#xff08;观察者对象&#xff09;都将得到通知。如果这样的依赖…

非零基础自学Golang 2 开发环境 2.1 Go 的安装

非零基础自学Golang 学习文档地址&#xff1a;https://www.topgoer.cn/ 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删【已联系过文档作者】 文章目录非零基础自学Golang2 开发环境2.1 Go 的安装2.1.1 下载地址2.1.2 Go 的安装2.1.3 安装检查2 开发环境…

TypeScript22(Rollup构建TS项目 webpack构建TS项目)

Rollup构建TS项目 安装依赖&#xff1a; 1.全局安装rollup&#xff1a; npm install rollup-g 2.安装TypeScript&#xff1a; npm install typescript -D 3.安装TypeScript 转换器&#xff1a; npm install rollup-plugin-typescript2 -D 4.安装代码压缩插件&#xff1a…

项目:金融行业反欺诈模型

当今以互联网、移动终端等为代表的技术力量正深刻地影响着金融支付市场&#xff0c;信息化、网络化、无线终端等技术的应用&#xff0c;使金融机构特别是银行业的经营发生了天翻地覆的变化&#xff0c;传统的银行柜台和网点业务&#xff0c;正渐渐被电子化交易所替代&#xff0…

[附源码]计算机毕业设计基于SpringBoot的黄河文化科普网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Golang开发变量声明命名惯例

《Go语言精进之路》第二、三章部分内容学习记录笔记。 1.基本原则 Golang开发中&#xff0c;可遵守简单且一致的命名原则&#xff0c;力求命名精简、易懂和一致。 package声明 Golang的package声明以小写形式的单个词进行命名&#xff1a; shopservice、utils、logs、tcc、l…

08_openstack之nova节点扩容

目录 一、环境准备 二、扩容节点配置 三、部署扩容节点 1、编辑answer.ini文件 2、执行安装 一、环境准备 部署openstack私有云环境&#xff1a;02_openstack私有云部署_桂安俊kylinOS的博客-CSDN博客 上述环境只部署了nova1节点&#xff0c;现将未部署的nova2节点作为扩…

1. Nginx 基本功能配置

Nginx 目录信息 图 为 windows 版本的。 进入Nginx的主目录我们可以看到这些文件夹 client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp 其中这几个文件夹在刚安装后是没有的&#xff0c;主要用来存放运行过程中的临时文件 client_body_t…

20221104英语学习

今日单词&#xff1a; portable adj.轻便的&#xff0c;便携的&#xff1b;手提式的 beautiful adj.美丽的, 风和日丽的, 出色的 hunter n.猎人, 狩猎者, &#xff08;猎食其他动物的&#xff09;猎兽, 搜集某种东西的人 circle n.圆, 圈, 圆形, 圆圈 style n.样式, 风格,…

Unity 算法 之 点集中计算绘制 凸包 的简单整理

Unity 算法 之 点集中计算绘制 凸包 的简单整理 目录 Unity 算法 之 点集中计算绘制 凸包 的简单整理 一、简单介绍 二、Graham扫描法 第一种说明&#xff1a; 第二种说明&#xff1a; 三、代码&#xff08;第二种说明&#xff09; 四、参考文献 一、简单介绍 算法&…

工作上的三个境界:能做,能做好,能持续做好

某天&#xff0c;技术岗A员工抬杠管理岗B员工的工作&#xff1a;你的工作啊&#xff0c;实习生都能做&#xff0c;你的价值太小了........一顿DISS。 这样的场景&#xff0c;似曾相识否&#xff1f;这是职场中常见的一类人“杠精”的表现。 做技术的&#xff0c;往往认为管理…

MySQL8.0 OCP最新版1Z0-908认证考试题库整理-006

原题 Choose the best answer.You are having performance issues with MySQL instances. Those servers are monitored withMySQL Enterprise Monitor.Using Query Analyzer, where do you begin to look for problem queries?A) Sort the "Exec" column and check…

什么是物联网?如何保护物联网iot安全性

物联网iot:物联网&#xff08;IoT&#xff09;将生活中事物以网络进行连接&#xff0c;彼此交换信息。整个世界借由设备连接成一体。 对于消费者而言&#xff0c;这意味着您可以在大洋彼岸远程调节家中的恒温器。但是对企业而言&#xff0c;物联网不仅创造了连接客户和合作伙伴…