4月14日总结
java学习
一.多线程
简介:多线程是计算机科学中的一个重要概念,它允许程序同时执行多个任务或操作。在单个程序内部,多线程使得代码可以并行执行,从而提高程序的性能和响应速度。
这里先来介绍一下创建多线程的几种方法。
1.扩展java.lang.Thread类
我们可以创建一个类,继承Thread,并且重写里面的run方法,将这个线程要去做的事写在run方法里面,在主程序实例化一个对象,在通过start启动它,这样就会创建另外一个子线程去执行run方法里面的功能。
public static void main(String[] args) {Thread t1=new Thread1("A");Thread t2=new Thread1("B");Thread t3=new Thread1("C");t1.start();t2.start();t3.start();}
public class Thread1 extends Thread{private String name;public Thread1(String name){this.name=name;}@Overridepublic void run() {for(int i=1;i<=3;i++){System.out.println(name+"线程执行:"+i);}}
}
C线程执行:1
A线程执行:1
B线程执行:1
A线程执行:2
C线程执行:2
A线程执行:3
B线程执行:2
C线程执行:3
B线程执行:3
可以看到,我们创建的三个子线程的任务交替进行。
为了看的更清楚,我们可以加点提示。
public static void main(String[] args) {System.out.println("主线程执行");Thread t1=new Thread1("A");Thread t2=new Thread1("B");Thread t3=new Thread1("C");t1.start();t2.start();t3.start();System.out.println("主线程结束");}
主线程执行
主线程结束
B线程执行:1
A线程执行:1
C线程执行:1
A线程执行:2
B线程执行:2
A线程执行:3
C线程执行:2
B线程执行:3
C线程执行:3
为什么主线程开始和结束都最快呢,因为主线程执行到子线程的创建不会停下,这也是多线程的优势,如果不加多线程,主线程会为了执行某个任务而停下,所以主线程会执行很快,子线程是主线程结束后才来时执行的,我们也可以知道,运行时会将所有线程的任务执行完才会停止。
2.实现java.lang.Runnable接口
相比于上一个方法,当前方式创建子线程更具有优势。
1》继承Thread只能单继承,Runnable可以多实现。
2》可以搭配线程池使用
3》适合多个相同的程序代码的线程去处理同一个资源
4》代码可以被多个线程共享,代码和数据独立
下面我们看看实现方式
public class Thread1 implements Runnable{private String name;public Thread1(String name){this.name=name;}@Overridepublic void run() {for(int i=1;i<=3;i++){System.out.println(name+"线程执行:"+i);}}
}
public static void main(String[] args) {System.out.println("主线程执行");Thread1 t1=new Thread1("A");Thread1 t2=new Thread1("B");Thread1 t3=new Thread1("C");new Thread(t1).start();new Thread(t2).start();new Thread(t3).start();System.out.println("主线程结束");}
主线程执行
主线程结束
A线程执行:1
B线程执行:1
C线程执行:1
B线程执行:2
A线程执行:2
B线程执行:3
C线程执行:2
A线程执行:3
C线程执行:3
3.实现Callable接口
相比于前面两种方法,实现Callable接口可以有返回值,还需要借助FutureTask类,去获取返回结果。
实现方法:
public class Thread1 implements Callable<Integer> {private int n;public Thread1(int n){this.n=n;}@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 1; i <= n; i++) {sum+=i;}System.out.println(1+"-"+n+"之间的和:"+sum);return sum;}
}
public static void main(String[] args) throws Exception {System.out.println("主线程执行");Thread1 t1=new Thread1(100);FutureTask<Integer> task=new FutureTask<>(t1);new Thread(task).start();System.out.println("主线程结束");}
主线程执行
主线程结束
1-100之间的和:5050
我们还可以调用FutureTask对象的get()方法,去回去返回值。、
4.线程池
简介:线程池是一种线程管理机制,用于优化多线程的创建、使用和销毁过程。它在程序启动时创建一定数量的线程,并将它们保存在一个线程池中。当需要执行任务时,线程池中的线程会被重复利用,而不是每次都创建新线程,从而降低了线程创建和销毁的开销,提高了程序的性能和响应速度。
这里搭配Runnable使用
public class Thread1 implements Runnable{@Overridepublic void run() {for(int i=1;i<=3;i++){System.out.println(Thread.currentThread()+"线程执行:"+i);}}
}
public static void main(String[] args) throws Exception {System.out.println("主线程执行");ThreadPoolExecutor tpool=new ThreadPoolExecutor(3,5,4,TimeUnit.SECONDS,new LinkedBlockingQueue<>(10) );Thread1 r1=new Thread1();tpool.execute(r1);tpool.execute(r1);tpool.execute(r1);tpool.execute(r1);tpool.shutdown();System.out.println("主线程结束");}
主线程执行
主线程结束
Thread[pool-1-thread-1,5,main]线程执行:1
Thread[pool-1-thread-2,5,main]线程执行:1
Thread[pool-1-thread-3,5,main]线程执行:1
Thread[pool-1-thread-2,5,main]线程执行:2
Thread[pool-1-thread-1,5,main]线程执行:2
Thread[pool-1-thread-2,5,main]线程执行:3
Thread[pool-1-thread-3,5,main]线程执行:2
Thread[pool-1-thread-1,5,main]线程执行:3
Thread[pool-1-thread-2,5,main]线程执行:1
Thread[pool-1-thread-3,5,main]线程执行:3
Thread[pool-1-thread-2,5,main]线程执行:2
Thread[pool-1-thread-2,5,main]线程执行:3
ThreadPoolExecutor里面的参数
依次是开始的线程数,最大的线程数(-开始的线程数为预备线程数),线程存活时间(空闲多久后销毁),时间格式,工作队列。
5.总结
多线程的特点和优势:
-
并发执行:多线程允许程序的多部分(线程)在同一时间片段内并行执行,从而实现并发。
-
资源共享:多个线程可以共享相同的内存地址空间,这使得数据共享和通信更加容易和高效。
-
更高的性能:在多核或多处理器系统中,多线程可以充分利用硬件资源,提高程序的执行效率。
-
提高响应性:通过将阻塞或耗时的任务放在单独的线程中执行,可以确保用户界面的响应性。
多线程的挑战:
-
同步问题:多个线程访问和修改共享数据可能导致数据不一致或冲突,需要使用同步机制如互斥锁、信号量等来解决。
-
死锁和竞态条件:不恰当地使用同步机制可能导致死锁或竞态条件,这是多线程编程中常见的问题。
-
调试和测试:多线程程序的调试和测试通常比单线程程序更加困难,因为需要考虑到各种可能的执行路径和并发条件。
多线程的应用场景:
-
图形用户界面(GUI)应用程序:如浏览器、文本编辑器等,通过多线程确保用户界面的流畅和响应。
-
服务器和网络编程:如Web服务器、数据库服务器等,通过多线程处理并发请求。
-
并行计算和数据处理:如科学计算、图像处理、机器学习等,通过多线程提高计算效率。
总的来说,多线程是一种强大的编程模型,它可以提高程序的性能和响应速度,但同时也带来了一些复杂性和挑战,需要开发者有一定的经验和技巧来有效地应用。
相关文章:
4月14日总结
java学习 一.多线程 简介:多线程是计算机科学中的一个重要概念,它允许程序同时执行多个任务或操作。在单个程序内部,多线程使得代码可以并行执行,从而提高程序的性能和响应速度。 这里先来介绍一下创建多线程的几种方法。 1.扩展…...
kafka---broker相关配置
一、Broker 相关配置 1、一般配置 broker.id 当前kafka服务的sid(server id),在kafka集群中,该值是唯一的(unique),如果未设置此值,kafka会自动生成一个int值;为了防止自动生成的值与用户设置…...
【Golang学习笔记】从零开始搭建一个Web框架(二)
文章目录 模块化路由前缀树路由 前情提示: 【Golang学习笔记】从零开始搭建一个Web框架(一)-CSDN博客 模块化路由 路由在kilon.go文件中导致路由和引擎交织在一起,如果要实现路由功能的拓展增强,那将会非常麻烦&…...
高精度地图导航论文汇总
文章目录 2021基于车载激光点云的高精地图矢量化成图[J] 2022基于高精度地图的智能车辆路径规划与跟踪控制研究[M] 2023一种无人驾驶融合决策方案的设计与实现[M] 2021 基于车载激光点云的高精地图矢量化成图[J] 摘要: 针对车载激光点云中对各特征物提取结果后矢量…...
【域适应】基于域分离网络的MNIST数据10分类典型方法实现
关于 大规模数据收集和注释的成本通常使得将机器学习算法应用于新任务或数据集变得异常昂贵。规避这一成本的一种方法是在合成数据上训练模型,其中自动提供注释。尽管它们很有吸引力,但此类模型通常无法从合成图像推广到真实图像,因此需要域…...
从零实现诗词GPT大模型:pytorch框架介绍
专栏规划: https://qibin.blog.csdn.net/article/details/137728228 因为咱们本系列文章主要基于深度学习框架pytorch进行,所以在正式开始之前,现对pytorch框架进行一个简单的介绍,主要面对深度学习或者pytorch还不熟悉的朋友。 一、安装pytorch 这一步很简单,主要通过p…...
[目标检测] OCR: 文字检测、文字识别、text spotter
概述 OCR技术存在两个步骤:文字检测和文字识别,而end-to-end完成这两个步骤的方法就是text spotter。 文字检测数据集摘要 daaset语言体量特色MTWI中英文20k源于网络图像,主要由合成图像,产品描述,网络广告(淘宝)MS…...
Windows环境下删除MySQL
文章目录 一、关闭MySQL服务1、winR打开运行,输入services.msc回车2、服务里找到MySQL并停止 二、卸载MySQL软件1、打开控制模板--卸载程序--卸载MySQL相关的所有组件 三、删除MySQL在物理硬盘上的所有文件1、删除MySQL的安装目录(默认在C盘下的Program …...
uniapp:uview-plus的一些记录
customStyle 并不是所有的组件都有customStyle属性来设置自定义属性,有的还是需要通过::v-deep来修改内置样式 form表单 labelStyle 需要的是一个对象 :labelStyle"{color: #333333,fontSize: 32rpx,fontWeight: 500}"dateTimePicker选择器设置默认值…...
OLTP 与 OLAP 系统说明对比和大数据经典架构 Lambda 和 Kappa 说明对比——解读大数据架构(五)
文章目录 前言OLTP 和 OLAPSMP 和 MPPlambda 架构Kappa 架构 前言 本文我们将研究不同类型的大数据架构设计,将讨论 OLTP 和 OLAP 的系统设计,以及有效处理数据的策略包括 SMP 和 MPP 等概念。然后我们将了解经典的 Lambda 架构和 Kappa 架构。 OLTP …...
步骤大全:网站建设3个基本流程详解
一.领取一个免费域名和SSL证书,和CDN 1.打开网站链接:https://www.rainyun.com/z22_ 2.在网站主页上,您会看到一个"登陆/注册"的选项。 3.点击"登陆/注册",然后选择"微信登录"选项。 4.使用您的…...
利用Sentinel解决雪崩问题(二)隔离和降级
前言: 虽然限流可以尽量避免因高并发而引起的服务故障,但服务还会因为其它原因而故障。而要将这些故障控制在一定范围避免雪崩,就要靠线程隔离(舱壁模式)和熔断降级手段了,不管是线程隔离还是熔断降级,都是对客户端(调…...
基于springboot的房产销售系统源码数据库
基于springboot的房产销售系统源码数据库 摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于房产销售系统当然也不能排除在外,随着网络技术的不断成熟,带动了房产…...
【MATLAB】基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据(附代码)
基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据 WiFi指纹匹配是室内定位最为基础和常见的研究,但是WiFi指纹的采集可以称得上是labor-intensive和time-consuming。现在,给大家分享一下我们课题组之前在做WiFi指纹定位时的基于射线跟踪技术仿真WiFi…...
深圳晶彩智能ESP32-3248S035R使用LovyanGFX实现手写板
深圳晶彩智能ESP32-3248S035R介绍 深圳晶彩智能出品ESP32-3248S035R为3.5寸彩色屏采用分辨率480x320彩色液晶屏,驱动芯片是ST7796。板载乐鑫公司出品ESP-WROOM-32,Flash 4M。型号尾部“R”标识电阻膜的感压式触摸屏,驱动芯片是XPT2046。 Lo…...
【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析
💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 Spring Boot 日志一. 日志的概念?…...
ISTQB选择国内版,还是国际版呢
1, ISTQB简介 ISTQB(International Software Testing Qualifications Board)是一个国际软件测试资格认证机构,旨在提供一个统一的软件测试认证标准。ISTQB成立于2002年,是非盈利性的组织,由世界各地的国家或地区软件测…...
头歌-机器学习 第11次实验 softmax回归
第1关:softmax回归原理 任务描述 本关任务:使用Python实现softmax函数。 相关知识 为了完成本关任务,你需要掌握:1.softmax回归原理,2.softmax函数。 softmax回归原理 与逻辑回归一样,softmax回归同样…...
Qt for MCUs 2.7正式发布
本文翻译自:Qt for MCUs 2.7 released 原文作者:Qt Group高级产品经理Yoann Lopes 翻译:Macsen Wang Qt for MCUs的新版本已发布,为Qt Quick Ultralite引擎带来了新功能,增加了更多MCU平台的支持,并且我们…...
共享IP和独享IP如何选择,两者有何区别?
有跨境用户在选择共享IP和独享IP时会有疑问,不知道该如何进行选择,共享IP和独享IP各有其特点和应用场景,选择哪种方式主要取决于具体需求和预算。以下是对两者的详细比较: 首先两者的主要区别在于使用方式和安全性:共…...
文心一言VSchatGPT4
文心一言和GPT-4各有优势,具体表现在不同的测试场景下。 在某些测试场景中心一言的表现优于GPT-4,例如在故事的完整度和情节吸引力方面,文心一言表现得更加符合指令,情节更吸引人。这可能得益于其模型在训练时对中文语境的深入理…...
Linux 目录结构与基础查看命令
介绍 目录结构如下 /bin:存放着用户最经常使用的二进制可执行命令,如cp、ls、cat等。这些命令是系统管理员和普通用户进行日常操作所必需的。 /boot:存放启动系统使用的一些核心文件,如引导加载器(bootstrap loader…...
【matlab】如何解决打开缓慢问题(如何让matlab在十几秒内打开)
【matlab】如何解决打开缓慢问题(如何让matlab在十几秒内打开) 找到我们解压缩时Crack中的license_standalone.lic文件,将其拷贝 在安装matlab的路径下新建一个文件,粘贴上面的license_standalone.lic文件 在桌面鼠标移动到matl…...
【stata】求滚动波动情况
0.计算对象 计算 t t t、 t 1 t1 t1、 t 2 t2 t2 这三起滚动波动情况 V o l i , t l n ( ∑ n t n t 2 ( g n − g ˉ ) 2 3 ) Vol_{i,t} ln(\sqrt{\frac{\sum_{nt}^{nt2}(g_{n}-\bar{g})^2}{3}}) Voli,tln(3∑ntnt2(gn−gˉ)2 ) e . g e.g e.g: 假设 200…...
The C programming language (second edition,KR) exercise(CHAPTER 2)
E x c e r c i s e 2 − 1 Excercise\quad 2-1 Excercise2−1:输出结果如图1和图2所示,这道练习题需要文章1和文章2的知识。 #include <stdio.h> #include <limits.h>float getFloat(char sign, unsigned char exp, unsigned mantissa); do…...
rust实现循环链表
作为一个计算机技术专家,针对你的问题,我将首先解释如何使用Rust语言实现循环链表,并提供相应的代码示例。然后,我将解释一个可能的报错问题及其解决方法。 循环链表的实现 在Rust中实现循环链表,首先需要定义链表节…...
2. Spring的创建和Bean的存取
经过前面的学习我们已经大体明白了 IOC 思想以及它的实现方式 DI ,本节要讲的是如何Spring框架实现实现DI。 本节目标: Spring(Core) 项目创建将对象存储到 Spring 中将对象(bean)从 Spring 中取出 1. 创建 Spring 项目 与开篇演示的 Spring Boot 项目不…...
策略模式【行为模式C++】
1.概述 策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。 策略模式通常应用于需要多种算法进行操作的场景,如排序、搜索、数据压缩等。在这些情况下&#x…...
php中session相关知识(目前了解部分)
#记录学习知识 一.ini_set() 在PHP中,ini_set() 函数用于在脚本运行时设置指定的配置选项的值。这些配置选项可以是PHP的核心设置,例如文件上传的最大大小、脚本的最大执行时间、错误报告级别等。使用 ini_set() 可以临时改变PHP.ini文件中的设置&am…...
从零实现诗词GPT大模型:GPT是怎么生成内容的?
专栏规划: https://qibin.blog.csdn.net/article/details/137728228 再开始编写GPT之前,我们得对GPT是怎么生成内容的有一个大致的了解。目前的神经网络我们大多都可以看成是一个黑盒,即我们把数据输送给网络后,网络给我我们输出,我们可以不用关心这个黑盒里到底是怎么实现…...
网站数据库地址是什么/软件推广赚佣金渠道
编写者日期关键词郑昀2007-6-19Meme 热点 引爆点 diggvs Digg们都有三个特点:l Digg自身并不产生内容,也不抓取新闻;l Digg首页的大部分新闻仅仅由少部分用户贡献(digg it);l Digg的一部分价值来自于…...
免费网站建站一级av/网络培训平台
http://ticktick.blog.51cto.com/823160/d-15 原创 Android音频开发(7):使用 OpenSL ES AP.. 2016-05-08 19:19:47本文主要介绍了 Android OpenSL ES 的框架设计和常见 API 的用法,并给出了示例代码,让初学者能够更加…...
手机网站诊断分析/网站推广计划方法
日志:历史事件日志历史事件:时间,事件时间级别(日志级别):事件的关键性程度;事件:系统引导启动、应用程序启动、应用程序尤其是服务类应用程序运行过程中的一些事件:系统日志服务:sy…...
注销主体和注销网站/seowhy培训
虽然平时能利用插件来实现,但是总是觉得,如果连个无缝轮播都写不出来,还玩个毛线; 其实现在还真的是玩毛线,因为代码都是别人的,不过嘛,很快就变成是我的啦! 代码还没封装成插件&…...
怎样自己做代刷网站/想建立自己的网站
大家好,我是 Richard Chen。 在此提前通知各位:微软计划于北京时间12月15日清晨发布17个安全补丁,其中2个最高级别为严重等级,14个为重要等级,1个为中度等级。共修复 Microsoft Windows、Office、Internet Explorer、…...
网站建设活动/seo外包 杭州
操作系统复习一,单项选择题1.在下列性质中,()不是分时系统的特征。a. 多路性b. 交互性c. 独占性d.成批性2.分时系统的响应与下列哪一个因素无关。()a. 时间片长短b. 系统时钟的频率c. 终端用户数d.主存和外存之间的信息交换量3. 所谓临界区是指()。a. 一个缓冲区b. …...