线程与线程池

单核cpu与多核cpu:

        线程的并发和并行问题

多线程的创建:

        多线程程序创建:java.lang.Thread(实现了Runnable接口)
        //            1定义一个类实现Runnable接口,重写run方法(run方法中设置线程任务),new一个Thread(参数)对象,将实现类当作参数传进去(可以用匿名内部类)
        //                用Thread对象点start方法开启线程(可以用匿名对象)
        //            2将一个类继承Thread类,重写run方法,创建这个类对象,调用start方法开启线程

线程安全问题:  多线程程序,无共享数据时,无安全问题
        //                多线程程序,有共享数据时,有安全问题
        //        解决方案:等待与唤醒机制:让一个线程在访问共享数据时,无论其是否失去CPU执行权,让其他线程等待
        //                同步代码块;同步方法        --->Object类方法
        //                Lock锁机制,
        //        线程间通信:多线程在处理同一资源,但处理过程(线程任务)不同,为有效利用资源,用等待与唤醒机制解决
        //        线程安全解决:同步代码块 synchronized( 锁对象(也叫对象监视器) ){ //访问共享数据或可能出现线程安全问题的代码}
        //                        注意:锁对象可以用任意对象,其只是相当于一个形式,但必须保证多线程使用的锁对象是同一个
        //                        作用:将同步代码块锁住,只让一个线程在同步代码块中执行,
        //                        执行逻辑:发现synchronized-->发现锁对象-->拿走(其实是赋值)--->执行完代码块中内容-->归还(赋值)
        //                                                        --->被拿走了,阻塞,直到拿到锁定对象,继续执行

 Lock锁机制:Lock接口:抽象方法:void Lock();  void unLock()
        //                            实现类:ReentrantLock类
        //                            使用:1 在类中方法外(成员变量位置)创建ReentrantLock对象
        //                                2 在可能出现安全问题的方法前调用Lock()方法
        //                                3 代码后调用unLock()方法 ; unLock可以在finally代码块中,这样无论是否有异常,都释放锁

线程池:

        线程池:使线程得以复用,不必频繁创建与销毁
        //        底层原理:创建一个集合List,存储多个线程:使用时Thread t=List.remove(0)/removeFirst()取出 
        //                                        使用后List.add(t)/addLast() 归还
        //        Executors类:java.until包中
        //            静态方法:static ExecutorService newFixedThreadPool(int x) 创建固定线程数量的线程池,返回值是ExecutorService接口的实现类对象
        //        ExecutorService接口:java.until.concurrent包中
        //            抽象方法:Feture<?> submit(Runnable task) 将线程放入池(第一次调用),并开启线程任务,用完自动归还线程池
        //                    void shutdown()  销毁线程池
        //        使用:1 使用Executor类内静态方法newFixedThreadPool创建线程池
        //            2 创建线程(2种方法)
        //            3 调用ExecutorService接口中抽象方法submit,使线程并入线程池(第一次调用),并执行线程任务(执行run方法)
        //                    submit        继承Thread类的类的对象/    实现Runnable类的类的对象     / 实现Runnable类的类的对象用Thread包装后的Thread对象
        //            4 调用ExecutorSerivce接口中shutdown方法,销毁线程池(不建议执行)
        //            5 匿名内部类线程可以放入,但没有意义

线程注意:

        1 为什么不直接调用run方法,而是要start?
        main线程start又一线程,main线程不会阻塞的(调用会阻塞的)
        主线程结束,其他线程可能没有结束(线程间基本不会收到影响:除非自己设置)
        
        直接调run方法,就是主线程,调用,并没有开另一线程
        源码:start方法源码会执行 start0方法,这是一个人本地方法,会另开线程
            start0只是将线程转为了可运行状态,【不一定会立即执行run】-》取决于cpu自己

控制线程退出:
        程序执行完自动退出
        使用【变量】控制run方法的退出,run方法退出,线程就结束了
            给主线程一个set方法,主线程就可以控制其退出了

Thread补充方法    :
        设置/获取线程优先级:
            setPriority     MAX_Priority 10     等3个常量
            getPriority
        interrupt
            中断线程:但是不是结束线程,所以一般用于中断休眠的线程,唤醒它
        
        yield让出cpu,让其他线程执行,但是礼让时间不确定,所以也不一定礼让成功 
            (cpu资源越紧张,礼让的对象占用cpu越大,礼让的成功率就越高)
                -》cpu不会认为它跑的过来,就听你的,先跑礼让的
        join让线程插队(一定先执行完插入线程的所有任务)
        
    用户线程和守护线程:
        用户线程:就是工作线程
        守护线程:为工作线程服务的,当所有用户线程结束,守护线程自动结束
            常见的守护线程:垃圾回收机制
            将一个线程设置为守护线程:
                主线程开启t1线程,t1无限循环,主线程退出,要求t1线程也退出-》将t1做成守护线程
            在(主角线程)设置守护线程: 陪葬品线程.setDaemon(true)就行了
            但是,要先设置,再启动 陪葬品线程(否则有异常)
            
    线程的生命周期:
        Thread的state是enum枚举类型,有6个取值,也就是有6种状态
        
        new 尚未启动
        runnable正在执行  ready和running  即使是running态,其运行也要看操作系统和cpu调度的
        blocked被阻塞,等待
        waiting等待 另一个线程的特定动作
        timeed_waiting等待,另一个线程执行达到某一指定时间
        terminated已退出的线程
        
        Thread的getState方法可以获得状态
        
    线程死锁:
        a线程必须拿到b线程的占用资源才释放锁
        但是同时,b线程必须拿到a的资源才释放锁
        
        你先完成作业,才能玩手机
        你先让我玩手机,才写作业
    
    线程释放锁的情况:
        同步方法完成
        同步方法有break/return
        出现未处理的异常/error,不得已释放锁
        调用锁对象的wait方法,【线程会暂停,并释放锁】
        
    线程不会释放锁的情况
        sleep方法,线程会暂停,但不会释放锁
        yield方法,线程会暂停,但不会释放锁
        尽量不再使用/过时的方法:
            线程正在执行,其他线程调用该线程的suspend方法,将该线程挂起,该线程不会释放锁
            resume方法,会结束其挂起
            状态图的runnable状态的线程挂起【注意】

【重要】:一个线程控制另一个线程
        需要在线程中有 控制线程的对象 ,构造方法给其赋值(set方法赋值)
        或者在构造方法中,将其设置为守护线程
        (但是注意守护线程不是正常退出,而是立即中断,可能有代码执行不到)
        所以还是用第一种比较好,用变量进行控制
        
    【重要】:多线程共享数据与安全
        锁的对象一定要是一个
        数据量小,可能一直是一个线程

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

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

相关文章

W5500实现以太网通信

实现原理 嵌入式程序跑在STM32微控制器&#xff0c;通过片上SPI控制器与W5500进行通信&#xff0c;配置所需网络参数并与远端服务器建立链接&#xff08;TCP客户端&#xff09;之后发送接收数据&#xff1b;又或者是建立服务器&#xff08;TCP服务器&#xff09;等待建立链接之…

mac电池最大充电限制工具 AlDente Pro中文 for Mac

Pro 版特有功能 热保护&#xff1a;在电池温度较高时为电池充电会导致电池老化更快。启用热保护后&#xff0c;当电池温度过高时&#xff0c;充电将自动停止。 航行模式&#xff1a;通常情况下&#xff0c;即使激活了最大电池充电&#xff0c;您的 MacBooks 电池也会始终稍微充…

记一次校园双选会面试问到的题

创建对象方式 线程安全和那些锁 stringbuff build区别 反射原理 集合底层 存储引擎myisam和innodb B树&#xff0c;慢查询&#xff0c;sql优化 数据库三大范式 左右内连接分别的效果 谈谈boot和spring&#xff0c;常用注解 ioc aop redis里的锁&#xff0c;缓存击穿穿透血崩&am…

7.上传project到服务器及拉取服务器project到本地、更新代码冲突解决

1.上传project到SVN服务器 1.在eclipse中&#xff0c;从show view里调出SVN资源库视图 2.在SVN资源库窗口的空白位置右键选择新建资源库位置 3.填好服务器的地址 4.资源库导入成功,SVN资源库视图下出现导入的资源库 5.新建project 6.写好project的初始版本 7.右键project --&…

Java面试题(每天10题)-------连载(43)

目录 Spring篇 1、请举例说明Qualifier注解 2、构造方法注入和设值注入有什么区别&#xff1f; 3、Spring框架中有哪些不同类型的事件&#xff1f; 4、FileSystemResource和ClassPathResource有什么区别&#xff1f; 5、Spring框架中都用到了哪些设计模式&#xff1f; 6…

激光雷达生成的图像检测关键点用来辅助里程计的方案

文章&#xff1a;LiDAR-Generated Images Derived Keypoints Assisted Point Cloud Registration Scheme in Odometry Estimation 作者&#xff1a;Haizhou Zhang , Xianjia Yu, Sier Ha , Tomi Westerlund 编辑&#xff1a;点云PCL 欢迎各位加入知识星球&#xff0c;获取PDF…

数据结构与算法编程题41

线性表中各结点的检索概率不等时&#xff0c;可用如下策略提高顺序检索的效率&#xff1a; 若找到指定的结点&#xff0c;则将该结点和其前驱结点&#xff08;若存在&#xff09;交换&#xff0c;使得经常被检索 的结点尽量位于表的前端。试设计在顺序结构的线性表上实现上述策…

使用Vue写一个日期选择器

在 Vue 中实现日期选择器的方法有很多&#xff0c;下面提供一个简单的实现方法。 首先&#xff0c;在需要使用日期选择器的组件中引用 Vue 和 date-fns 库&#xff0c;date-fns 库是一个轻量级的 JavaScript 时间日期工具库&#xff0c;可以方便地处理日期的格式化和计算。 &…

DCGAN生成网络模型

DCGAN&#xff08;Deep Convolutional Generative Adversarial Network&#xff09;是一种生成对抗网络&#xff08;GAN&#xff09;的变体&#xff0c;专门设计用于生成图像。它结合了卷积神经网络&#xff08;CNN&#xff09;和生成对抗网络的概念&#xff0c;旨在生成具有高…

Java的接口和抽象类

在Java编程中&#xff0c;接口和抽象类是两个重要的概念。它们都用于实现面向对象编程中的抽象和封装&#xff0c;但在使用方式和功能上有所不同。本文将详细介绍Java中接口和抽象类的概念、用法和示例代码&#xff0c;帮助读者更好地理解和应用它们。 一、接口&#xff08;In…

C语言/C++实战项目雷霆飞机(代码改进)

上代码 #include <stdio.h> #include <easyx.h> #include <time.h> #include <Mmsystem.h> #pragma comment(lib,"winmm.lib") #define WIDTH 600 #define HEIGHT 850 #define bullet_max 5000 //我方飞机子弹最大量 #define enem…

mysql基础之DQL基本单表查询

学习DQL之前先知道sql语句的执行顺序 from->join->on->where->group by->count(字段)->having->select->distinct->order by->limit null无法和任何值进行比较&#xff08;不相等&#xff09;&#xff0c;包括null和null也不相等 1.DQL简单查询…

免费好用的5个AI写作工具,如何更好的使用AI写作工具

人工智能&#xff08;AI&#xff09;作为当今科技领域的热门话题&#xff0c;正在以惊人的速度改变我们生活的方方面面。从智能助手到自动驾驶汽车&#xff0c;AI的应用已经渗透到我们日常的方方面面。 1. 什么是AI人工智能&#xff1f; 什么是AI人工智能&#xff1f;简而言之…

CCF编程能力等级认证GESP—C++1级—20230318

CCF编程能力等级认证GESP—C1级—20230318 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)每月天数长方形面积 答案及解析单选题判断题编程题1编程题2 单选…

会声会影2024软件还包含了视频教学以及模板素材

会声会影2024中文版是一款加拿大公司Corel发布的视频编软件。会声会影2024官方版支持视频合并、剪辑、屏幕录制、光盘制作、添加特效、字幕和配音等功能&#xff0c;用户可以快速上手。会声会影2024软件还包含了视频教学以及模板素材&#xff0c;让用户剪辑视频更加的轻松。 会…

Qt event事件发送

阻塞型事件发送 需要重写接收对象的event()事件处理函数 当事件发送后,将会立即进入event()事件处理函数进行事件处理 通过sendEvent()静态函数实现阻塞发送: bool QApplication::sendEvent ( QObject * receiver, QEvent * event ) ; // receiver:接收对象, event :要发送…

基于springboot+vue篮球联盟管理系统源码

&#x1f345; 简介&#xff1a;500精品计算机源码学习 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 文末获取源码 目录 一、以下学习内容欢迎交流&#xff1a; 二、文档资料截图&#xff1a; 三、项目技术栈 四、项目运行图 背景&#xff1a; 篮球运…

对比分析:黑盒测试 VS 白盒测试

一、引言 在软件开发过程中&#xff0c;测试是确保产品质量的关键环节。其中&#xff0c;黑盒测试和白盒测试是两种常见的测试方法。本文将详细解析这两种测试方法的定义、特点&#xff0c;同时通过具体示例进行对比分析。 二、黑盒测试 黑盒测试&#xff0c;又称功能测试&…

社区分享|简米Ping++基于MeterSphere开展异地测试协作

上海简米网络科技有限公司&#xff08;以下简称为“简米”&#xff09;是国内开放银行服务商&#xff0c;高新技术企业&#xff0c;中国支付清算协会会员单位。自2014年成立至今&#xff0c;简米长年聚焦金融科技领域&#xff0c;通过与银行、清算组织等金融机构合作&#xff0…

uni-app详解、开发步骤、案例代码

uni-app概念 uni-app是一个使用Vue.js开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序、快应用等多个平台。它允许开发者使用一套代码同时构建多个平台的应用程序,包括iOS、Android、H5、微信小程序、支付宝小程序、百度小…