回炉重造java----多线程

概念

883e32949e1443fc9a70ccac0fd670d3.jpg

注: main方法其实也是一个线程。在java中所以的线程都是同时启动的,至于什么时候,哪个先执行,完全看谁先得到CPU的资源。在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集(gc )线程

线程的创建

74d09aa44b0943abaae52fe7ad8d4364.jpg

第一种:继承Thread类,重写run方法(其底层也是实现了Ruunable接口)

20fd67ff441e4316b6dac3aea432234e.jpg

faed3d395f61438784314047dcbdcf81.jpg

第二种:实现Runnable接口,重写run方法(启动线程时要把对象丢进Thread对象中)

56bd891d2612485eb6b75d528515cab9.jpg

d2cf1ecc79bd473f99dfcd1ef64ad70d.jpg


两种方式的总结:

实现Runnable接口比继承Thread类所具有的优势:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立

4):线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类

第三种:实现Callable接口(了解)

bcc9a4a6960d4f419b02cfe07919aac5.jpg

线程属性

 ①线程ID,标识线程

 ②线程名字    ③线程优先级(1-10),优先级越高越优先执行,但并不成正比关系

④线程状态,NEW   RUNNALBE  BLOCKED  WAITING  TERMINATED

⑤线程类别,ture标识守护线程(后台记录操作日志,监控内存,垃圾回收),false标识用户线程。虚拟机必须保证用户线程的执行完毕,不用等待守护线程执行

线程状态

b8be8c213f2f487d9afba094b5aa163e.jpg

线程休眠sleep():

①参数为阻塞线程的毫秒数

②阻塞时间到了之后线程进入就绪状态

③每个对象都有一把锁,sleep不会释放锁

等待线程停止join():

①相当于插队,在主线程中是子线程join(),即主线程等待子线程执行完毕再执行

线程礼让yield():

①礼让的意思是停止cpu对该进程的执行,即从运行状态变成就绪状态

②礼让不一定成功,得看cpu的调度

线程停止:

①使其自动运行完然后停止

②可以设置一个标志位flag来停止线程

③不要使用stop()和destory()等过时或者JDK不建议的方法去停止线程

线程同步(并发)

package Algorithm.SYN;

public class UnsafeThread {

    public static void main(String[] args) {
        Buytciket buytciket = new Buytciket();

        new Thread(buytciket,"1号").start();
        new Thread(buytciket,"2号").start();
        new Thread(buytciket,"3号").start();
    }

}


class Buytciket implements Runnable{

    //定义总数量
    private int TicketNum = 10;
    boolean flag = true;

    @Override
    public void run() {
        //买票
        while (flag){
            try {
                buy();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
    
    private void buy() throws InterruptedException {
        //判断是否有票
        if(TicketNum <= 0){
            flag = false;
            return;
        }
        //模拟延时
        Thread.sleep(100);
        //买票
        System.out.println(Thread.currentThread().getName()+"买到了第"+TicketNum--+"票");
    }
}

可见出现了线程的并发问题。

 锁机制(synchronized):

synchronized锁又可以分为synchronized方法和synchronized块:其默认锁的是this,即对象本身。synchronized块锁的是变化的量(对象)。

    //synchronized同步方法
    private synchronized void buy() throws InterruptedException {
        //判断是否有票
        if(TicketNum <= 0){
            flag = false;
            return;
        }

        //买票
        System.out.println(Thread.currentThread().getName()+"买到了第"+TicketNum--+"票");
    }

 拓展:JUC包下的安全集合CopyOnWriteArrayList,可以实现线程集合安全

 

死锁

 private void mu() throws InterruptedException {
        if(choice == 0){
            //获得口红
            synchronized (lipstick){
                System.out.println(this.name+"获得口红");
                Thread.sleep(1000);

                synchronized (m){
                    System.out.println(this.name+"获得镜子");
                }
            }
        }
        else{
            //获得口红
            synchronized (m){
                System.out.println(this.name+"获得镜子");
                Thread.sleep(2000);

                synchronized (lipstick){
                    System.out.println(this.name+"获得口红");
                }
            }
        }

发生死锁!!进程全部阻塞 

private void mu() throws InterruptedException {
        if(choice == 0){
            //获得口红
            synchronized (lipstick){
                System.out.println(this.name+"获得口红");
                Thread.sleep(1000);
            }

            synchronized (m){
                System.out.println(this.name+"获得镜子");
            }
        }
        else{
            //获得口红
            synchronized (m){
                System.out.println(this.name+"获得镜子");
                Thread.sleep(2000);
            }

            synchronized (lipstick){
                System.out.println(this.name+"获得口红");
            }
        }

产生死锁的条件:

 

 Lock锁(显式)

 两种锁的对比:

 

 

 线程池

public class pool {

    public static void main(String[] args) {

        //创建线程池
        ExecutorService service = Executors.newFixedThreadPool(10);//线程池大小

        //执行
        service.execute(new my());
        service.execute(new my());
        service.execute(new my());
        service.execute(new my());

        //关闭连接
        service.shutdown();
    }
}

class my implements Runnable{
    
    @Override
    public void run() {
            System.out.println(Thread.currentThread().getName());
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hikyuu高性能量化研究框架助力探索

Hikyuu Quant Framework 是一款基于C/Python的开源量化交易分析与研究工具&#xff0c;主要用于A股市场的交易策略分析与回测&#xff0c;目前不支持期货等&#xff0c;需要自行改造。 Hikyuu的目标 Hikyuu的最初目的是为了快速对A股全市场股票进行策略回测和验证&#xff0c…

[数据集][目标检测]电力场景安全帽检测数据集VOC+YOLO格式295张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;295 标注数量(xml文件个数)&#xff1a;295 标注数量(txt文件个数)&#xff1a;295 标注类别…

Git之revert的使用

问题场景&#xff1a; 提交代码都是以merge request的形式合并到主分支master的。 由于有一个merge request被误merge了&#xff0c;这期间又有同时merge了其它内容。 如何快速将这个被误merge的request从master上revert呢&#xff1f; 实例演示&#xff1a; 下面是最近的5…

消息中间件Kafka(PHP版本)

小编最近需要用到消息中间件&#xff0c;有需要要复习一下以前的东西&#xff0c;有需要的自取&#xff0c;强调一点&#xff0c;如果真的想了解透彻&#xff0c;一定要动手&#xff0c;脑袋会了不代表就会写了 Kafka是由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅…

Debian Linux 下给Nginx 1.26.0 编译增加Brotli算法支持

明月发现参考【给Nginx添加谷歌Brotli压缩算法支持】一文给出的方法&#xff0c;在Debian Linux 12.5下就一直编译失败&#xff0c;主要的错误是因为文件缺失&#xff0c;在专门又安装了apt-get install libbrotli-dev的依赖库后依然会因为文件缺失无法编译完成&#xff0c;就这…

用 Python 从头开始​​编写线性回归

找到最佳拟合线的方法是使用梯度下降&#xff0c;我们将随机绘制一条线&#xff0c;计算该线的误差 计算误差 给定m和b&#xff0c;我们将计算直线的误差。Eeeor用sigma表示法表示 def compute_error_for_line_given_points(b, m, points):totalError 0for i in range(0, len…

安装conda并搭建python环境(入门教程)

文章目录 1. 什么是 conda&#xff1f;1.1 Conda 与 Anaconda 的区别1.2 Conda 与 pip 的区别 2. 下载安装3. 配置并使用 conda3.1 配置下载源3.2 环境管理3.2.1 创建&#xff08;删除&#xff09;环境3.2.2 激活&#xff08;切换&#xff09;环境3.2.2 下载&#xff08;卸载&a…

机器学习——2.损失函数loss

基本概念 损失函数也叫代价函数。损失函数就是计算预测结果和实际结果差距的函数&#xff0c;机器学习的过程就是试图将损失函数的值降到最小。 图左&#xff1a;&#xff5c;t_p - t_c&#xff5c; 图右&#xff1a;&#xff08;t_p - t_c&#xff09;**2 代码实…

[OpenGL高级光照] 阴影改善

目录 一 阴影失真 二 阴影改善 2.1 减小片段深度值 2.2 降低纹理 2.3 注意事项 三 消除Repeat的问题 3.1 让裁剪矩阵的立方体变大 ​3.2 利用采样范围重置 四 精度问题 本章节源码 点击此处 一 阴影失真 在上一篇中,实现了阴影效果之后,但是我们会发现阴影效果中地面…

47-Qt控件详解:Buttons Containers1

一 QPushButton (命令按钮) #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QPushButton>//引入QPushButton类对应的头文件class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWind…

【IMX6ULL项目】IMX6ULL下Linux实现产测工具框架

电子产品量产测试与烧写工具。这是一套软件&#xff0c;用在我们的实际生产中&#xff0c; 有如下特点&#xff1a; 1.简单易用&#xff1a; 把这套软件烧写在 SD 卡上&#xff0c;插到 IMX6ULL 板子里并启动&#xff0c;它就会自动测试各个模块、烧写 EMMC 系统。 工人只要按…

40 -1 入侵检测系统(IDS)- IDS的使用及规则

xampp 官网:XAMPP Installers and Downloads for Apache Friends 一、安装 XAMPP XAMPP 简介 XAMPP是完全免费且易于安装的Apache发行版,其中包含MariaDB、PHP和Perl。XAMPP开放源码包的设置让安装和使用出奇容易。 开始安装 如果命令行下载太慢,就在浏览器中下载完再拉…

【2024新版】龙年新版ui周易测算网站H5源码/在线起名网站源码/运势测算网站系统源码

>>>功能说明&#xff1a; 1、系统配置&#xff1a;系统基本配置、测算价格配置、在线预约配置、系统信息配置、代理分成配置、推广积分配置、VIP价格配置、账号管理 2、推广管理&#xff1a;我的信息、推广链接、订单管理、体现管理 3、付费应用&#xff0c;订单管…

高校课程评价|基于SSM+vue的高校课程评价系统的设计与实现(源码+数据库+文档)

高校课程评价系统 目录 基于SSM&#xff0b;vue的高校课程评价系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2学生功能 3教师功能 4专家功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&…

Windows Docker 使用 httpd 部署静态 Web 站点

一、简介 httpd 是 Apache超文本传输协议&#xff08;HTTP&#xff09;服务器的主程序&#xff0c;是一个独立运行的后台进程&#xff0c;专门负责处理 HTTP 请求。它通过建立子进程或线程的池来高效管理请求&#xff0c;确保服务器能够迅速响应客户端的需求。httpd 因其高效率…

【Delphi】OpenCV 实战(一):OpenCV简介及开发环境配置

目录 一、OpenCV 功能模块 二、Delphi 中使用OpenCV 三、OpenCV 4.7 Delphi开发环境配置 1. 环境配置 2. OpenCV 中Demo程序的编译配置 3. 运行 Demo (OpenCV for Delphi) OpenCV 是世界上最大的计算机视觉库。 它是开源的,包含 2500 多种算法,由非营利…

信息系统项目管理师0105:项目评估与决策(7项目立项管理—7.3项目评估与决策)

点击查看专栏目录 文章目录 7.3项目评估与决策1.评估依据2.评估的程序3.项目评估的内容4.项目评估报告内容大纲记忆要点总结7.3项目评估与决策 项目评估指在项目可行性研究的基础上,由第三方(国家、银行或有关机构)根据国家颁布的政策、法规、方法、参数和条例等,从国民经济…

算法题② —— 链表专栏

1. 链表数据结构 struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}};2. 链表的删除 2.1 移除链表元素 力扣&#xff1a;https://leetco…

大规模 RGB LED灯控系统 Lumos:创新与智能化的融合

灯控系统&#xff1a;创新与智能化的融合 在现代照明技术不断进步的背景下&#xff0c;灯控系统的应用已经从简单的开关控制&#xff0c;发展到能够进行复杂程控操作的智能化管理。我们推出的新一代灯控解决方案&#xff0c;凭借其高度的可配置性和跨平台兼容性&#xff0c;已…

Python | Leetcode Python题解之第86题分隔链表

题目&#xff1a; 题解&#xff1a; class Solution:def partition(self, head: Optional[ListNode], x: int) -> Optional[ListNode]:sml_dummy, big_dummy ListNode(0), ListNode(0)sml, big sml_dummy, big_dummywhile head:if head.val < x:sml.next headsml sm…