Java(多线程)

一、基本概念

  1. 进程:一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
  2. 线程:操作系统中能够进行运算的最小单位,它被包含在进程之中,是进程中的实际运作单位。(简单理解:应用软件中相互独立,可以同时运行的功能)
  • 多线程:

           作用:提高效率

            应用场景:多件事情同时运行

   3.并发并行

  • 并发:在同一时刻,有多个指令在CPU上交替执行
  • 并行:在同一时刻,有多个指令在CPU上同时执行

二、多线程实现方法

1.继承Thread类

  • 创建继承Thread的子类

  • 重写Thread类的run()方法

  • 创建Thread类的子类的对象。

  • 通过此对象调用start()来启动一个线程。

public class MyThread extends Thread {
    public void run(){
        for (int i = 0; i < 100; i++) {
            System.out.println(getName()+"HelloWord");
        }
    }

    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        t1.start();
        t2.start();
    }
}

 

 2.实现Runnable接口

  • 定义一个类实现Runnable接口
  • 重写里面的Run()方法
  • 创建自己的类的对象
  • 创建一个Thread类的对象调用start(),开起线程
public class RunnableThread {
    public static void main(String[] args) {
        MyRun mr = new  MyRun();
        Thread t1 = new Thread(mr);
        t1.start();
        Thread t2 = new Thread(mr);
        t2.start();
    }
}

class MyRun implements Runnable {
    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            System.out.println(Thread.currentThread().getName()+":/t"+i);
        }
    }
}

 

3.利用Callable接口和Future接口(特点:可以获取到多线程运行的结果)

  • 创建一个类MyCallable实现callable接重写call (是有返回值的,表示多线程运行的结果)

  • 创建MyCallable的对象(表示多线程要执行的任务)

  • 创建FutureTask的对象(作用管理多线程运行的结果)

  • 创建Thread类的对象,并启动(表示线程) 

三种方式对比:

6bef3e8f96984e58a1fdf0bda091b45c.png

 

三、常见的成员方法

834f67aac1f54d4bb1f67d711a8d10d3.png 

四、线程的生命周期

线程的动态特征表明:它由创建而生,由调度而执行,由撤销而消亡。说明线程具有一个从生到死的生命周期。

新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态

就绪:处于新建状态的线程被start()后,将进入线程队列等待cpu时间片,此时它已经具备了运行               的条件

运行:当就绪的线程被调度并获得处理器资源时,便进入运行状态,run()方法定义了线程的操作               和功能

阻塞:在某种特殊情况下,被人为挂起或者执行输入输出操作时,让出cpu并临时终止你自己的执             行,进入阻塞状态

死亡:线程完成了它的全部工作或线程被提前强制性地中止

e6990a237a5242498529e4375ce20abc.png

 

五、多线程安全性问题的解决

如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。 程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 线程安全问题都是由全局变量及静态变量引起的。 若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

解决方法:

1.同步代码块

  • 将操作共享的代码锁起来
  • 锁默认打开,有一个线程进去了,锁自动关闭
  • 里面的代码全部执行完毕,线程出来,锁自动打开

      05fd2e12c129450fa1228028f84370d0.png

public class MyThread extends Thread {

    static int a = 0;
    static Object obj = new Object();
    public void run(){
        while(true){
            synchronized (obj){
                if(a<100){
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    a++;
                    System.out.println(getName()+"卖第"+a);
                }
                else
                    break;

            }
        }
    }
}
public class Test {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();

        t1.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");

        t1.start();
        t2.start();
        t3.start();
    }
}

 2.同步方法:

  • 将 synchronized关键字加在方法上
  • 锁住方法里的所有代码
  • 锁对象不能自己制定
  • 非静态的同步方法,同步监视器是:this
  • 静态的同步方法,同步监视器是:当前类的字节码文件对象
  • 格式:

99ea165daccd4900b9d683ce7abc66c7.png

 

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

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

相关文章

比较好玩的车子 高尔夫6

https://www.sohu.com/a/484063087_221273 四万多如愿收获手动挡高尔夫6&#xff0c;可靠性、经济性、操控性兼顾_搜狐汽车_搜狐网 2.基本上其他人也不知道到底是什么相关的车子信息

【算法刷题】八大排序算法总结(冒泡、选择、插入、二分插入、归并、快速、希尔、堆排序)

文章目录 八大排序算法总结1.冒泡排序2.选择排序3.插入排序4.二分插入排序5.归并排序6.快速排序7.希尔排序8.堆排序 八大排序算法总结 排序排序方法平均情况最好情况最坏情况空间稳定性1冒泡排序O(n2)O(n)O(n2)O(1)稳定2选择排序O(n2)O(n2)O(n2)O(1)不稳定3插入排序O(n2)O(n)O…

java io模型

一、五种IO模型 在《Unix网络编程》一书中提到了五种IO模型&#xff0c;分别是&#xff1a;阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。 而Reactor模式实现了同步非阻塞模型&#xff0c;而Proactor模式实现了异步非阻塞模型 具体方面请参考我的另一篇博客 网络io…

Spring Validation解决后端表单校验

NotNull&#xff1a;从前台传递过来的参数不能为null,如果为空&#xff0c;会在控制台日志中把message打印出来 Range&#xff1a;范围&#xff0c;最大多少&#xff0c;最小多少 Patten&#xff0c;标注的字段值必须符合定义的正则表达式&#xff08;按照业务规则&#xff0…

车队试验的远程实时显示方案

风丘科技推出的数据远程实时显示方案更好地满足了客户对于试验车队远程实时监控的需求&#xff0c;并真正实现了试验车队的远程管理。随着新的数据记录仪软件IPEmotion RT和相应的跨平台显示解决方案的引入&#xff0c;让我们的客户端不仅可在线访问记录器系统状态&#xff0c;…

Go语言中的互斥锁(Mutex)和读写锁(RWMutex)

Mutex Mutex结构体 type Mutex struct {state int32 //表示互斥锁的状态,比如是否被锁定等sema uint32 //表示信号里,协程阻塞等待的信号量,解锁的协程释放信号量从而唤醒等待信号量的协程 } Locked: 表示Mutex是否已被锁定(1表示已经被锁定)Woken: 表示是否有协程被唤醒(1已有…

达梦的归档日志参数ARCH_RESERVE_TIME测试

达梦的参数ARCH_RESERVE_TIME测试 前面有提到和oracle相比&#xff0c;达梦的归档日志相关参数有个比较特别&#xff0c;可以通过设置它去规定归档日志的保留时间。 ARCH_RESERVE_TIME&#xff1a;归档日志保留时间&#xff0c;单位分钟&#xff0c;取值范围 0~2147483647。只…

Angular 使用DomSanitizer

跨站脚本Cross-site scripting 简称XSS&#xff0c;是代码注入的一种&#xff0c;是一种网站应用程序的安全漏洞攻击。它允许恶意用户将代码注入到网页上&#xff0c;其他用户在使用网页时就会收到影响&#xff0c;这类攻击通常包含了HTML和用户端脚本语言&#xff08;JS&…

Word中图表题注样式自动编号

需求 在写论文的时候&#xff0c;希望图表题注是下面的样子&#xff0c;其中图号表示为&#xff1a;章的编号-本章中图的序号&#xff0c;而且都是小写数字。 网上找的方法大多是使用 “插入题注” 来插入&#xff0c;此时章的编号是大写的&#xff0c;如“图一-1”。然后再通…

什么是Rust?

Rust is a programming language focused on safety, particularly safe concurrency, supporting functional and imperative-procedural paradigms. Rust is syntactically similar to C, but it provides memory safety without using garbage collection. Rust是一种专注于…

[大模型]ChatGLM3-6B Transformers部署调用

ChatGLM3-6B Transformers部署调用 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载…

在 Python 中使用 Turtle 绘制火影忍者

火影忍者是一个流行的动漫角色&#xff0c;它是最受欢迎的动漫之一&#xff0c;下面的代码将向您展示如何使用 python Turtle 绘制火影忍者。 import turtle turtle.Screen().bgcolor("#eeeeee") draw turtle.Turtle() draw.pencolor("red") draw.pensi…

FPGA:图像数字细节增强算法(工程+仿真+实物,可用毕设)

目录 日常唠嗑一、视频效果二、硬件及功能1、硬件选择2、功能3、特点 未完、待续……四、工程设计五、板级验证六、工程获取 日常唠嗑 有2个多月没写文章了&#xff0c;又是老借口&#xff1a;“最近实在是很忙”&#x1f923;&#xff0c;不过说真&#xff0c;确实是比较忙&am…

Spring与Spring Boot的区别:从框架设计到应用开发

这是我自己开发的一款小程序&#xff0c;感兴趣的可以体验一下&#xff1a; 进入正题&#xff1a; 在Java开发领域&#xff0c;Spring和Spring Boot都是备受推崇的框架&#xff0c;它们为开发人员提供了丰富的功能和便捷的开发体验。然而&#xff0c;许多人对它们之间的区别仍…

【状态机dp】【 排序 】 2809使数组和小于等于 x 的最少时间

本文涉及知识点 【状态机dp】 排序 LeetCode 2809. 使数组和小于等于 x 的最少时间 给你两个长度相等下标从 0 开始的整数数组 nums1 和 nums2 。每一秒&#xff0c;对于所有下标 0 < i < nums1.length &#xff0c;nums1[i] 的值都增加 nums2[i] 。操作 完成后 &…

MySQL-多表查询:多表查询分类、SQL99语法实现多表查询、UNION的使用、7种SQL JOINS的实现、SQL99语法新特性、多表查询SQL练习

多表查询 1. 一个案例引发的多表连接1.1 案例说明1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解1.3 案例分析与问题解决 2. 多表查询分类讲解分类1&#xff1a;等值连接 vs 非等值连接等值连接非等值连接 分类2&#xff1a;自连接 vs 非自连接分类3&#xff1a;内连接…

结构型模式--3.组合模式【草帽大船团】

1. 好大一棵树 路飞在德雷斯罗萨打败多弗朗明哥之后&#xff0c;一些被路飞解救的海贼团自愿加入路飞麾下&#xff0c;自此组成了草帽大船团&#xff0c;旗下有7为船长&#xff0c;分别是&#xff1a; 俊美海贼团75人 巴托俱乐部56人 八宝水军1000人 艾迪欧海贼团4人 咚塔塔海…

Leetcode223. 矩形面积

Every day a Leetcode 题目来源&#xff1a;223. 矩形面积 解法1&#xff1a;数学 两个矩形覆盖的总面积等于两个矩形的面积之和减去两个矩形的重叠部分的面积。由于两个矩形的左下顶点和右上顶点已知&#xff0c;因此两个矩形的面积可以直接计算。如果两个矩形重叠&#xf…

Datacom HCIP笔记-MPLS协议 之二

在Ingress节点执行该命令时&#xff0c;触发所有的32位路由建立LDPLSP。 在Egress节点执行该命令时&#xff0c;触发本地32位路由建立LDPLSP&#xff0c; egress就是主机路由始发路由器 ingress就是主机路由非始发路由器 默认情况下&#xff1a;华为路由器仅为非物理接口主机路…

MCM制品图软件使用技巧-常见问题

常见问题 匀色效果不好 观察整体颜色是否一致&#xff1a;整体严重不一致时&#xff0c;使用参考匹配进行匀色处理&#xff1b;部分图层存在亮度色差时&#xff0c;使用人工调色对图层进行单独微调&#xff0c;比如提高亮度、对比度等等。局部纹理是否存在丢失&#xff0c;丢…