【JavaSE】多线程(学习笔记)

一、多线程概述

  1. 进程:正在运行的程序
    1. 系统进行资源分配粒调用的独立单位
    2. 每一个进程都有它自己的内存空间和系统资源
  2. 线程:进程中的单个顺序控制流,是一条执行路径
    1. 单线程:一条执行路径
    2. 多线程:多条执行路径

二、多线程的实现

1、继承Thread类

1)使用

重写run()方法,调用start()方法

  • run():封装线程执行的代码
  • start():执行线程,jvm虚拟机调用run()方法
2)设置/获取线程名称

void setName(String name):改线程名

String getName():返回线程名

构造方法设置线程名称 --> 子类需写带参构造方法

public 类名(String s){super(s);
}

public static Thread currentThread():获取对当前正在执行的线程对象的引用

Tread.currentThread().getName();

2、实现Runnable接口

1)使用
  1. 定义类实现Runnable接口,重写run()方法,并创建对象
  2. 创建Thread对象,让类的对象传入
    1. Thread(Runnable target)
    2. Thread(Runnable target, String name)
  3. 启动线程
2)优点

方便继承别的类

多个线程访问一个资源

三、线程优先级

1、线程调度

分时调度模型:线程轮流使用CPU ,平均分配cpu时间片

抢占式调度模型:优先让优先级高的线程使用CPU,优先级相同则随机分配

Java使抢占式调度模型,线程执行具有随机性

2、查询/设置优先级

public final int getPriority():返回此线程的优先级

public final void setPriority(int newPriority):更改此线程的优先级

  • 最大10
  • 最小1
  • 默认5

四、线程控制

  1. static void sleep(long millis):使当前正在执行的线程停留(暂停执行)指定的毫秒数
  2. void join():等待这个线程死亡 --> 使其线程独占
  3. void setDaemon(boolean on):标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出
    1. boolean on:true开启,false关闭
    2. 不会立即退出

五、线程生命周期

  1. 创建对象:new()
  2. 有资格,没权利:start()
  3. 有资格,有权利运行:抢到了cpu资源
    1. 阻塞:sleep()
    2. 结束:stop()

六、线程同步

1、数据安全问题

1)原因

1、多线程环境

2、有共享数据

3、有多条语句操作共享数据

2)解决方法

不允许多线程共同操作共享数据

2、同步代码块

synchronized(任意对象) {多条语句操作共享数据的代码
}

synchronized(任意对象):任意对象就可以看成是一把锁/钥匙

3、同步方法

1)同步方法

格式:修饰符 synchronized 返回值类型 方法名(方法参数){}

锁/钥匙:this

2)同步静态方法

格式:修饰符 static synchronized 返回值类型 方法名(方法参数){}

锁/钥匙:类名.class

4、线程安全类

  1. StringBuffer:线程安全的StringBuilder
  2. Vector:线程安全的ArrayList
  3. Hashtable:线程安全的HashMap
  4. 返回线程安全的列表
// 定义
static <T> List<T> synchronized (List<T> list)
// 实例
List<Integer> list = Collections.synchronizedList(new ArrayList<>());

5、Lock锁

1)间接实例化

private Lock lock = new ReentrantLock;

2)获得锁

void lock()

3)关闭锁

void unlock()

七、生产者消费者模型

1、概述

生产者 --> 共享数据区域 <—消费者

2、Object类的等待唤醒方法

  1. void wait():当前线程等待
  2. void notify():唤醒正在等待对象监视器的单个线程
  3. void notifyAll():唤醒所有线程

3、使用注意

  1. wait()notify()/notifyAll()成对出现
  2. 加入boolean state变量判断等待与唤醒

4、代码实现

public class Box {private int milk;private boolean state = false;public synchronized void put(int milk) {if(state){try {wait();} catch (InterruptedException e) {e.printStackTrace();}}this.milk = milk;System.out.println("送第" + this.milk + "瓶奶");state = true;notifyAll();}public synchronized void get(){if(!state) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("取第" + milk + "瓶奶");state = false;notifyAll(); }
}
public class Customer implements Runnable{private Box b;public Customer(Box b) {this.b = b;}@Overridepublic void run() {while(true){b.get();}}
}
public class Producer implements Runnable {private Box b;public Producer(Box b) {this.b = b;}@Overridepublic void run() {for (int i = 1; i <= 5; i++) {b.put(i);}}
}
public class BoxDemo {public static void main(String[] args) {Box b = new Box();Customer c = new Customer(b);Producer p = new Producer(b);Thread t1 = new Thread(c);Thread t2 = new Thread(p);t1.start();t2.start();}
}

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

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

相关文章

qt 5.15.2 主窗体事件及绘制功能

qt 5.15.2 主窗体事件及绘制功能 显示主窗体效果图如下所示&#xff1a; main.cpp #include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.setFixedWidth(600);w.setFixedHeight(6…

Nat easy IP ACL

0表示匹配&#xff0c;1表示任意&#xff08;主机位0.0.0.255&#xff08;255主机位&#xff09;&#xff09; rule deny source 192.168.2.1 0 设置拒绝192.168.2.1的主机通过 记住将其应用到接口上 [AR2]acl 2000 //创建基本ACL [AR2-acl-basic-2000]rule deny source 192…

Fiddler的配置、原理和使用

一、Fiddler的工作原理 本地应用与服务器之间所有的请求&#xff08;request&#xff09;和响应&#xff08;response&#xff09;&#xff0c;由fiddler进行转发&#xff0c;此时fiddler以代理服务器的方式存在。 由于所有的网络数据都要经过fiddler&#xff0c;因此&#xf…

014 OpenCV canny边缘检测

一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、canny原理 OpenCV中的Canny边缘检测算法是一种基于图像处理的计算机视觉技术&#xff0c;主要用于检测图像中的边缘。Canny边缘检测算法的原理是通过计算图像中像素点之间的梯度值来…

ClickHouse(16)ClickHouse日志引擎Log详细解析

日志引擎系列 这些引擎是为了需要写入许多小数据量&#xff08;少于一百万行&#xff09;的表的场景而开发的。 这系列的引擎有&#xff1a; StripeLogLogTinyLog 共同属性 引擎&#xff1a; 数据存储在磁盘上。 写入时将数据追加在文件末尾。 不支持突变操作,也就是更新…

python开发案例教程-清华大学出版社(张基温)答案(3.1)

目录 练习 3.1 1、判断题 2、选择题 3、代码分析题 4、程序设计题 练习 3.1 1、判断题 (1) 函数定义可以嵌套。 (✔) (2) 函数调用可以嵌套。 …

SAP MIGO前台批次特性值增强(自动带出)<转载>

原文链接&#xff1a;https://blog.csdn.net/qq_45063256/article/details/128464411 增强点&#xff1a;程序LCTMSF3Z 在MIGO中点击批次右边的分类时&#xff0c;自动将该批次的批次特性值带出来。 现在打开程序LCTMSF3Z 该程序就只有一个FORM&#xff0c;首先切换到编辑…

AIGC: 关于ChatGPT中基于API实现一个StreamClient流式客户端

Java版GPT的StreamClient 可作为其他编程语言的参考注意: 下面包名中的 xxx 可以换成自己的代码基于java&#xff0c;来源于网络&#xff0c;可修改成其他编程语言实现参考前文: https://blog.csdn.net/Tyro_java/article/details/134748994 1 &#xff09;核心代码结构设计 …

RTLS 在医疗保健中使用的好处

实时定位系统 (RTLS) 和物联网 (IoT) 提供有关患者、医疗设备和工作人员的数据。 医疗保健管理员可以通过互联的生态系统改善患者和员工的体验&#xff0c;同时降低运营成本并提高效率。了解医疗保健系统如何使用 RTLS 以及如何实现优化物联网策略的优势。 定义医疗保健实时定…

加载预训练权重时不匹配

场景 复现Rethinking the Learning Paradigm for Dynamic Facial Expression Recognition这篇论文时&#xff0c;加载已经训练好的.pt文件进行推理&#xff0c;发现准确率很低。利用下面两行代码加载预训练的权重&#xff1a; weights_dict torch.load(/data2/liuxu/attribu…

3.C程序编译步骤

目录 1 预处理 2 编译 3 汇编 4 链接 5 文件大小情况 依次执行下面4个步骤 预处理 将所有头文件展开&#xff0c;比如stdio.h等&#xff0c;展开就相当于把stdio.h中的所有代码粘贴到你的代码里。将所有的宏文件展开&#xff0c;像stdio.h是官方定义的头文件&#x…

STM32F407-14.3.11-01互补输出和死区插入

互补输出和死区插入 高级控制定时器&#xff08;TIM1 和 TIM8&#xff09;可以输出两路互补信号&#xff0c;并管理输出的关断与接通瞬间。 这段时间通常称为死区&#xff0c;用户必须根据与输出相连接的器件及其特性&#xff08;电平转换器的固有延迟、开关器件产生的延迟...&…

海云安参与制定《信息安全技术 移动互联网应用程序(App)软件开发工具包(SDK)安全要求》标准正式发布

近日&#xff0c;由TC260&#xff08;全国信息安全标准化技术委员会&#xff09;归口 &#xff0c;主管部门为国家标准化管理委员会&#xff0c;深圳海云安网络安全技术有限公司&#xff08;以下简称“海云安”&#xff09;等多家相关企事业单位共同参与编制的GB/T 43435-2023《…

redis 安装在liunx安装和常用文件配置

文章目录 安装配置文件设置测试启动服务连接服务 安装 1.官网下载压缩包: https://redis.io/download/ 2.将压缩包上传到Linux环境中 解压: tar -xvf redis-xxxxx 3.liunx 需要c的环境 yum -y install gcc-c4.进入redis文件夹 make && make install5.推荐不是必须…

内存垃圾回收

对一个方法调用完成后&#xff0c;如何立即恢复该方法使用的内存&#xff1a; 一、 在Java中&#xff0c;垃圾回收是由Java虚拟机&#xff08;JVM&#xff09;自动管理的&#xff0c;而不是由程序员手动进行的。垃圾回收器会自动检测不再被引用的对象&#xff0c;并释放其占用…

游戏的UI管理的完整机制总结及框架展示

目录 UI管理机制总结 层级管理 显示类型 SoringLayer 使用列表记录处于不同状态的页面 供外调用的增删改查函数 资源预加载函数 外部回调执行函数 遮罩效果 还原界面 事件系统 垃圾回收 UI管理机制总结 自己根据源码总结出的一套UI管理机制&#xff0c;大概讲述了如…

网络调试助手 连接Onenet 多协议接入平台 TCP透传协议

onenet文档链接 多协议接入地址 打开Onenet平台&#xff0c;多协议接入 选择TCP透传协议&#xff0c;点击添加产品&#xff0c;输入信息&#xff0c;点击确认 点击设备列表&#xff0c;添加设备 下面需要上传一个解析脚本文件该文件的下载地址lua文件下载地址 建立连接 设备…

策略模式终极解决方案之策略机

我们在开发时经常会遇到一堆的if else …, 或者switch, 比如我们常见的全局异常处理等, 像类似这种很多if else 或者多场景模式下, 策略模式是非常受欢迎的一种设计模式, 然而, 一个好的策略模式却不是那么容易写出来. 我在工作中也因为写烦了switch,if else 觉得很不优雅, 因…

2022 China Collegiate Programming Contest (CCPC) Guilin Site

A.Lily Problem - A - Codeforces 题意 思路 数所有周围没L的格子 #include <bits/stdc.h>using i64 long long;constexpr int N 2e5 10; constexpr int mod 1e9 7; constexpr int Inf 0x3f3f3f3f; constexpr double eps 1e-10;std::string s;int n;void solv…

cv2.threshold 图像二值化

图像二值化 whatparameters示例 what cv2.threshold是OpenCV中用于进行图像二值化的函数。它的作用是将输入图像的像素值转换为两个可能的值之一&#xff0c;通常是0&#xff08;黑色&#xff09;或255&#xff08;白色&#xff09;&#xff0c;根据一个设定的阈值。图像二值化…