简单了解多线程
并发和并行
并发: 在同一时刻,多个指令在单一CPU上交替指向
并行:在同一时刻,多个指令在多个CPU上同时执行
2核4线程,4核8线程,8核16线程,16核32线程
基础实现线程的方式
- Thread :继承类 ,无返回
- Runnable :实现接口,无返回
- Callable 核 TaskFurture : 实现接口,有返回
public static void main(String[] args) {MyThread t1 = new MyThread();t1.setName("自定义线程-1");MyThread t2 = new MyThread("自定义线程-2");t1.start();t2.start();}static class MyThread extends Thread{// int ticket = 100; // 单个线程私有
// static int ticket = 100; // MyThread类启动的多线程共有public MyThread() {}public MyThread(String name) {super(name);}@Overridepublic void run() {for (int i=1;i<1000;i++){System.out.println(Thread.currentThread().getName()+" "+i);}}}
public class RunnableMain {public static void main(String[] args) {MyRunnable r1 = new MyRunnable();Thread t1 = new Thread(r1,"自定义线程-1");Thread t2 = new Thread(t1,"自定义线程-2");t1.start();t2.start();}static class MyRunnable implements Runnable{// int ticket = 100; // 线程共享@Overridepublic void run() {for (int i=1;i<1000;i++){System.out.println(Thread.currentThread().getName()+" "+i);}}}
}
public class CallableMain {public static void main(String[] args) throws ExecutionException, InterruptedException {MyCallable c1 = new MyCallable();FutureTask<Integer> f1 = new FutureTask<>(c1);Thread t1 = new Thread(f1);t1.start();System.out.println(f1.get());}static class MyCallable implements Callable<Integer>{@Overridepublic Integer call() throws Exception {Integer count = 0;for (int i=1;i<1000;i++){count+=i;}return count;}}
}
常见的成员方法
| 方法名称 | 说明 |
| String getName() | 返回此线程的名称 |
| void setName() | 设置线程的名称 |
| static Thread currentThread() | 获得当前线程对象 |
| static void sleep(long time) | 让当前线程休眠,单位:毫秒 |
| setPriority(int newPriority) | 设置线程优先级,1-10,10最大优先级,默认5 |
| final int getPriority() | 获取线程的优先级 |
| final void setDaemon(boolean on) | 设置为守护线程,其他非守护线程的线程结果,守护线程也将结束 |
| public static void yield() | 礼让线程,让线程跑得更均匀 |
| public staic void join() | 插入线程,插入得线程跑完再继续执行被插入线程 |
生命周期

同步代码块synchronized (),同步方法,local锁
// lock是接口,用ReentrantLock实现
Lock reentrantLock = new ReentrantLock();
reentrantLock.lock();
reentrantLock.unlock();
注意退出的时候,是否带锁退出,最好放在finally块里
死锁:相互等待
等待/唤醒
锁.wait();
锁.notifyAll(); //唤醒所有这两个方法必须在同步代码块内部调用
交替执行:
public class MyArrayBlockingQueue {static Integer count = 10;static Integer hasFood = 0;static Object obj = new Object();public static void main(String[] args) {Cooker cooker = new Cooker();Eater eater = new Eater();Thread t1 = new Thread(cooker);Thread t2 = new Thread(eater);t1.start();t2.start();}@Datastaticclass Cooker implements Runnable {private ArrayBlockingQueue abq;@Overridepublic void run() {while (true) {if (count == 0) {break;} else {synchronized (MyArrayBlockingQueue.obj) {if (hasFood == 1) {// 有食物try {MyArrayBlockingQueue.obj.wait();} catch (InterruptedException e) {e.printStackTrace();}} else {hasFood++;System.out.println("做了一份菜");MyArrayBlockingQueue.obj.notifyAll();}}}}}}@Datastaticclass Eater implements Runnable {private ArrayBlockingQueue abq;@Overridepublic void run() {while (true) {if (count == 0) {break;} else {synchronized (MyArrayBlockingQueue.obj) {if (hasFood == 0) {// 没有食物try {MyArrayBlockingQueue.obj.wait();} catch (InterruptedException e) {e.printStackTrace();}} else {hasFood--;count--;System.out.println("吃了一份菜,还剩下" + count + "容量的肚子");MyArrayBlockingQueue.obj.notifyAll();}}}}}}}
阻塞队列
继承:
Iterable -> Collection -> Queue -> BlockingQueue -> ArrayBlockQueue(数组有界) / LinkedBlockQueue(数组无界)
线程池
// 获取一个单线程的线程池:
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();// 获取FixThread 线程池: 指定活跃线程数量2
ExecutorService executorService = Executors.newFixedThreadPool(2);// 创建一个可缓存的线程连接池,无限大(完全取决于操作系统最大允许多少)
// 超过60秒自动回收
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();// 1. 获取周期性线程池, 传入核心线程的大小
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
多线程(二) | 彻底搞懂线程池-Executors_executor.submit-CSDN博客
相关文章:
简单了解多线程
并发和并行 并发: 在同一时刻,多个指令在单一CPU上交替指向 并行:在同一时刻,多个指令在多个CPU上同时执行 2核4线程,4核8线程,8核16线程,16核32线程 基础实现线程的方式 Thread :继承类 &…...
GEE对上传并读取CSV文件
首先在Assets中上传csv csv格式如下所示: 上传好了之后,来看看这个表能否显示 var table ee.FeatureCollection("projects/a-flyllf0313/assets/dachang_2022"); var sortedTable table.sort(id); // 替换 propertyName 为你想要排序的属性…...
vulnhub-----SickOS靶机
文章目录 1.信息收集2.curl命令反弹shell提权利用POC 1.信息收集 ┌──(root㉿kali)-[~/kali/vulnhub/sockos] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:10:3c:9b, IPv4: 10.10.10.10 Starting arp-scan 1.9.8 with 256…...
slab分配器
什么是slab分配器? 用户态程序可以使用malloc及其在C标准库中的相关函数申请内存;内核也需要经常分配内存,但无法使用标准库函数;linux内核中,伙伴分配器是一种页分配器,是以页为单位的,但这个…...
MySQL面试题之基础夯实
一、mysql当中的基本数据类型有哪些 MySQL中的基本数据类型包括但不限于以下几大类: 数值类型: 整数类型:TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT浮点数类型:FLOAT、DOUBLE、DECIMAL…...
feign请求添加拦截器
FeignClient 的 configuration 属性: Feign 注解 FeignClient 的 configuration 属性,可以对 feign 的请求进行配置。 包括配置Feign的Encoder、Decoder、 Interceptor 等。 feign 请求添加拦截器,也可以通过这个 configuration 属性 来指…...
蓝桥杯之简单数论冲刺
文章目录 取模快速幂 取模 这道题目有两个注意点: 1.当你的取模之后刚好等于0的话,后面就不用进行后面的计算 2.if sum detail[i] > q: 这个语句的等号也很重要 import os import sys# 请在此输入您的代码a,b,n map(int,input().split())week a*5 …...
Http的缓存有哪些
HTTP 缓存可以通过多种 HTTP 头部字段来控制,主要包括以下几种: 1.Expires:这个字段定义了响应的过期时间。如果当前时间小于 Expires 的时间,那么就可以直接使用缓存。 2.Cache-Control:这个字段是一个指令ÿ…...
Linux 网络虚拟化 Macvlan(基于物理网络接口虚拟网络接口) 认知
写在前面 博文内容涉及 Macvlan 的简单认知,以及一个Demo博文内容根据《 Kubernetes 网络权威指南:基础、原理与实践》 整理理解不足小伙伴帮忙指正 不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前…...
Spark-Scala语言实战(1)
在之前的文章中,我们学习了如何在Linux安装Spark以及Scala,想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark及Scala的安装https:/…...
NBlog Java定时任务-备份MySQL数据
NBlog部署维护流程记录(持续更新):https://blog.csdn.net/qq_43349112/article/details/136129806 为了避免服务器被攻击,给博客添加了一个MySQL数据备份功能。 此功能是配合博客写的,有些方法直接用的已有的…...
微信小程序项目实战遇到的问题
我们以学生成绩平台来作为例子。这是我们想得到的效果。 以下是完整代码: index.js // index.js Page({//页面的初始数据data: {hello: 欢迎进入微信小程序的编程世界,score: 80,userArray: [{name: 张三,score: [66, 77, 86, 70, 90]},{name: 李四,score: [88, 7…...
网络原理(3)——TCP协议
目录 一、连接管理 二、三次握手 1、何为三次握手? 2、三次握手有何意义? 三、四次挥手 三次握手和四次挥手的相似之处和不同之处 (1)相似之处 (2)不同之处 四、TCP的状态 建立连接: 断开…...
nginx多级代理配置获取客户端真实ip
流量路径 #mermaid-svg-NX785p8k6RVBngHY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NX785p8k6RVBngHY .error-icon{fill:#552222;}#mermaid-svg-NX785p8k6RVBngHY .error-text{fill:#552222;stroke:#552222;}#…...
Django框架的全面指南:从入门到高级【第128篇—Django框架】
👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Django框架的全面指南:从入门到高级 Django是一个高效、功能强大的Python Web框…...
C++类和对象基础
目录 类的认识 访问限定符:public(公有),protected(保护),private(私有)。 类的两种定义方式: 类的实例化: 封装: 类的对象大小的计算: 类成员函数的this指针: C语言是面向过程的语言&am…...
消息队列常见的两种消费模式
一、点对点模式 点对点模式:生产者发送消息到消息队列,消费者从消息队列中接收、处理消息,消息被消费后,就不在消息队列中了。每个消息只能由一个消费者接收和处理。如果有多个消费者监听同一个队列,消息将被发送到其…...
php的伪协议详解
在 PHP 中,伪协议(pseudo-protocols)是一种特殊的语法,用于访问各种资源,如文件、网络、输入/输出流等。伪协议实际上并不是真正的协议,而是一种简便的语法,用于访问不同的资源类型。 以下是一…...
【研发日记】Matlab/Simulink技能解锁(四)——在Simulink Debugger窗口调试
文章目录 前言 Block断点 分解Block步进 Watch Data Value 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑窗口Debug》 见《【研发日记】Matlab/Simul…...
沪深主板打板胜率统计
统计了20100101以来的数据,以中信日K为数据来源。 计算方法: 选出每只股票 (收盘价-开盘价)/开盘价 >0.098的日期,然后往后取3天数据,如果3天内有一天能涨超0.2元,则认为打板成功。 总共打板: 52239次 胜: 43784次…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
