当前位置: 首页 > news >正文

JAVA-线程

        先上图,有点长,比较碎,有xmind文件......,详细内容均在图片里介绍了,提供了PDF文件

1.线程简介 

        进程是操作系统中正在执行的不同的应用程序,例如:我们可以同时打开Word和记事本

        线程是一个应用程序进程中不同的执行路径。进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。

        进程是线程的容器。一个进程可以有多个线程,至少有一个线程。而一个线程只能在一个进程的地址空间活动

2.多线程的三种实现方式

3.线程常用方法

3.1.Thread

//Thread
public class MyThread extends Thread{@Overridepublic void run(){for (int i = 0; i < 10; i++) {System.out.println(getName() + "run方法里的函数");}}}
//创建开启线程
public abstract class ThreadDemo {public static void main(String[] args) {// 创建 MyThread 类的实例MyThread t1 = new MyThread();MyThread t2 = new MyThread();t1.setName("线程1");t2.setName("线程2");// 启动线程t1.start();t2.start();}
}

3.2.Runnable

//Runnable
public class MyRunnable implements Runnable {@Overridepublic void run() {//获取当前线程的对象Thread thread = Thread.currentThread();System.out.println(thread.getName() + "MyRunnable.run方法实列");}
}//创建开启线程
public class ThreadDemo {public static void main(String[] args) {/** 多线程的第二中启动方式:* 1.自己定义一个类实现Runnable方法* 2.重写里面的run方法* 3.创建自己的类的对象* 4.创建一个Thread类的对象,并开启线程* */MyRunnable myRunnable = new MyRunnable();Thread thread1 = new Thread(myRunnable);Thread thread2 = new Thread(myRunnable);thread1.setName("线程1");thread2.setName("线程2");thread1.start();thread2.start();}
}

3.3.Callable

//Callable
public class MyCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {return 100;}
}
//第三种方式
public class ThreadDemo {public static void main(String[] args) throws ExecutionException, InterruptedException {/**多线程的第三种是实现方式*   特点:可以获取到多线程运行的结果*   1、创建一个类MyCallable实现Callable接口*   2、重写call方法(有返回值的,表示多线程运行的结果)*   3、创建MyCallable的对象(表示多线程要执行的任务)*   4、创建FutureTalk的对象(作用是管理多线程运行的结果)*   5、创建Thread类的对象,并启动(表示线程)* *///创建MyCallable的对象(表示多线程要执行的任务)MyCallable myCallable = new MyCallable();//创建FutureTalk的对象(作用是管理多线程运行的结果FutureTask<Integer> futureTask = new FutureTask<>(myCallable);//创建对象Thread thread = new Thread(futureTask);//启动线程thread.start();//获取多线程运行的结果Integer i = futureTask.get();System.out.println(i);}
}

4.锁

锁是一种同步机制,可以用来协调多个线程的并发访问,以保证对共享资源的安全访问。可以理解为防止一件东西同时被多个人使用。用于保护线程安全的一种机制。 

4.1.synchronized锁

  static int ticket = 0;@Overridepublic void run() {while (true) {synchronized (MyThread.class) {if (method()) break;}}}private synchronized boolean method() {if (ticket < 99){try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}ticket++;System.out.println(Thread.currentThread().getName() + "正在卖第 " + ticket + "票!");}else{return true;}return false;}

4.2.lock锁

public class MyThread extends Thread {static int ticket = 100;static Lock lock = new ReentrantLock();@Overridepublic void run() {/** Lock实现提供比使用sunchronized方法和语句更广泛的锁定操作* lock中提供了获得锁和释放锁的方法* void lock():获得锁* void unlock():释放锁** Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化* ReentrantLock的构造方法** ReentrantLock():创建一个ReentrantLock的实例** */while (true) {//同步代码块,lock上锁lock.lock();if (ticket == 100){break;}else {try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}finally {//释放锁lock.unlock();}ticket++;System.out.println(Thread.currentThread().getName() + "在卖第" + ticket);}}}
}

4.3.死锁

详细介绍可看开头的图片

5.生产者和消费者问题

5.1.线程的等待和唤醒

public class Desk {/** 控制生产者和消费者的执行* *///是否有面条 0:没有 1:有public static int foodFlag = 0;//总个数public static int count =10;//锁对象public static Object lock = new Object();
}//消费者
public class Cook extends Thread {/** 消费者* */@Overridepublic void run() {while (true) {synchronized (Desk.lock){if(Desk.count == 0){break;}else{//判断桌子上是否有食物//如果有就等待,没有就唤醒if(Desk.foodFlag == 1){try {//等待Desk.lock.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}else{System.out.println("厨师做了一碗面条");//修改桌子状态Desk.foodFlag = 1;//唤醒Desk.lock.notifyAll();}}}}}
}
//生产者
public class Foodie extends Thread {/*生产者* */@Overridepublic void run() {/** 1.循环* 2.同步代码块* 3.判断共享数据是否到了末尾(到了末尾)* 4.判断共享数据是否到了末尾(没有到达末尾,执行核心逻辑)** */while (true) {synchronized (Desk.lock){//先判断桌子上是否有面条if(Desk.count == 0){break;}else{if(Desk.foodFlag == 0){//如果没有try {Desk.lock.wait();//让当前线程和锁进行绑定} catch (InterruptedException e) {throw new RuntimeException(e);}}else{//把吃的总数-1Desk.count--;//如果有就开吃System.out.println(Desk.count + "碗!!!");//吃完之后,唤醒厨师继续做Desk.lock.notifyAll();//修改桌子的状态Desk.foodFlag = 0;}}}}}
}

5.2.阻塞队列

public class ThreadDemo {public static void main(String[] args) {/** 阻塞队列的继承结构* 接口:Iterable*      Collection*      Queue*      BlockingQueue* 实现类L:ArrayBlocking : 数组 ,有界*        LinkedBlockingQueue:底层是链表,无界,但不是真正的无界,最大为int的最大值+** */ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(1);Cook cook = new Cook(queue);Foodie foodie = new Foodie(queue);cook.start();foodie.start();}
}

6.线程池

        线程池是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。

6.1.ExecutorService

public class MyThreadPoolDemo {public static void main(String[] args) {/*public static ExecutorService newCachedThreadPool()    创建一个没有上限的线程池public static ExecutorService newFixedThreadPool(int nThread)    创建有上限的线程池*///1.获取线程池对象,池子本身是空的,提交任务的时,池子会创建新的线程对象,// 任务执行完毕,线程归回给池子,下回再次提交任务时,不需要创建新的线程,直接复用已有的线程ExecutorService pool = Executors.newCachedThreadPool();ExecutorService pool1 = Executors.newFixedThreadPool(3);//提交任务pool.submit(new MyRunnable());pool.submit(new MyRunnable());//销毁线程池pool.shutdown();}

6.2.ThreadPoolExecutor

public class ThreadPool {public static void main(String[] args) {ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3,6,60,TimeUnit.SECONDS,new ArrayBlockingQueue<>(2),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());threadPoolExecutor.submit(new MyRunnable());}
}

相关文章:

JAVA-线程

先上图&#xff0c;有点长&#xff0c;比较碎&#xff0c;有xmind文件......&#xff0c;详细内容均在图片里介绍了&#xff0c;提供了PDF文件 1.线程简介 进程是操作系统中正在执行的不同的应用程序&#xff0c;例如&#xff1a;我们可以同时打开Word和记事本 线程是一个应用…...

代码随想录——电话号码的字母组合(Leetcode17)

题目链接 回溯 class Solution {List<String> res new ArrayList<String>();StringBuilder str new StringBuilder();HashMap<String, String> Sites new HashMap<String, String>();public List<String> letterCombinations(String digit…...

多款可观测产品全面升级丨阿里云云原生 5 月产品月报

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 趋势热点 &#x1f947; 阿里云云原生产品负责人李国强&#xff1a;推进可…...

python实践笔记(三): 异常处理和文件操作

1. 写在前面 最近在重构之前的后端代码&#xff0c;借着这个机会又重新补充了关于python的一些知识&#xff0c; 学习到了一些高效编写代码的方法和心得&#xff0c;比如构建大项目来讲&#xff0c;要明确捕捉异常机制的重要性&#xff0c; 学会使用try...except..finally&…...

Excel VLOOKUP 使用记录

Excel VLOOKUP 使用记录 VLOOKUP简单使用 VLOOKUP(lookup_value,table_array,col_index_num,[range-lookup]) 下面是excel对VLOOKUP 的解释 lookup_value&#xff08;查找值&#xff09;&#xff1a;要匹配查找的值 table_array&#xff08;数据表&#xff09;&#xff1…...

Spring Cloud Stream 消息驱动基础入门与实践总结

Spring Cloud Stream是用于构建与共享消息传递系统连接的高度可伸缩的事件驱动微服务框架&#xff0c;该框架提供了一个灵活的编程模型&#xff0c;它建立在已经建立和熟悉的Spring熟语和最佳实践上&#xff0c;包括支持持久化的发布/订阅、消费组以及消息分区这三个核心概念。…...

你好rust

第一次安装rust&#xff0c;记录一下笔记。 几年前就听说过rust&#xff0c;自己一直是个c爱好者&#xff0c;所以比较抵触rust&#xff0c;早年还有什么rust向上突破群。一直比较抵触&#xff0c;直到这几年rust已经渐渐深入到linux内核、云原生可观测以及zend社区当中&#x…...

STM32 printf 重定向到CAN

最近在调试一款电机驱动板 使用的是CAN总线而且板子上只有一个CAN 想移植Easylogger到上面试试easylogger的效果&#xff0c;先实现pritnf的重定向功能来打印输出 只需要添加以下代码即可实现 代码 #include <stdarg.h> uint8_t FDCAN_UserTxBuffer[512]; void FDCAN_p…...

jmeter性能优化之mysql监控sql慢查询语句分析

接上次博客&#xff1a;基础配置 多用户登录并退出jmx文件&#xff1a;百度网盘 提取码&#xff1a;0000 一、练习jmeter脚本检测mysql慢查询 随意找一个脚本(多用户登录并退出)&#xff0c;并发数设置300、500后分别查看mysql监控平台 启动后查看&#xff0c;主要查看mysql…...

海南聚广众达电子商务咨询有限公司引领行业变革

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度发展。海南聚广众达电子商务咨询有限公司&#xff0c;凭借其在抖音电商领域的深厚积累和不断创新&#xff0c;正逐步成为行业的佼佼者。这家以专注、专业、专注为核心理念的公司&#xff0c;不仅为客户提供全…...

Unity API学习之资源的动态加载

资源的动态加载 在实际游戏开发的更新换代中&#xff0c;随着开发的软件不断更新&#xff0c;我们在脚本中需要拖拽赋值的变量会变空&#xff0c;而要想重新拖拽又太花费时间&#xff0c;因此我们就需要用到Resources.Load<文件类型>("文件名")函数来在一开始…...

C++算法——回溯

回溯算法 实现思想 先看一个实例&#xff1a; //暴力枚举的算法 int n 5; for (int a 1; i < n; i) {for (int b 1; b < n; b){for (int c 1; c < n; c){for (int d 1; d < n; d){for (int e 1; e < n; e){//判断 abcde 是否互补相同if (a ! b &&a…...

java的深拷贝和浅拷贝

总结&#xff1a; 深拷贝&#xff1a;无论是基本类型还是引用类型都会创建新的实例。 浅拷贝&#xff1a;对于基本类型就是复制其值&#xff0c;对于引用类型则是复制了指向这些数据类型的内存地址。 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝是指在创建新对象时&am…...

AI产品经理,应掌握哪些技术?

美国的麻省理工学院&#xff08;Massachusetts Institute of Technology&#xff09;专门负责科技成果转化商用的部门研究表明&#xff1a; 每一块钱的科研投入&#xff0c;需要100块钱与之配套的投资&#xff08;人、财、物&#xff09;&#xff0c;才能把思想转化为产品&…...

同三维T80004EHL-W-4K30 4K HDMI编码器,支持WEBRTC协议

输入&#xff1a;1路HDMI1路3.5音频&#xff0c;1路HDMI环出1路3.5音频解嵌输出 4K30超高清,支持U盘/移动硬盘/TF卡录制&#xff0c;支持WEBRTC协议&#xff0c;超低延时&#xff0c;支持3个点外网访问 1个主流1个副流输出&#xff0c;可定制选配POE供电模块&#xff0c;WEBR…...

Hi3861 OpenHarmony嵌入式应用入门--点灯

本篇实现对gpio的控制&#xff0c;通过控制输出进行gpio的点灯操作。 硬件 我们来操作IO2&#xff0c;控制绿色的灯。 软件 GPIO API API名称 说明 hi_u32 hi_gpio_deinit(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO…...

SaaS案例分享:成功构建销售渠道的实战经验

面对SaaS产品推广的难题&#xff0c;你是否曾感到迷茫&#xff0c;不知如何选择有效的销售渠道&#xff1f;Shopify独立站联盟营销或许能为你提供新的思路。Shopify作为领先的电商解决方案提供商&#xff0c;其独立站功能为众多商家提供了强大的在线销售平台。而联盟营销&#…...

密钥管理简介

首先我们要知道什么是密钥管理&#xff1f; 密钥管理是一种涉及生成、存储、使用和更新密钥的过程。 密钥的种类 我们知道&#xff0c;对称密码主要包括分组密码和序列密码。但有时也可以将杂凑函数和消息认证码划分为这一类&#xff0c;将它们的密钥称为对称密钥&#xff1b;…...

2024中国应急(消防)品牌巡展成都站成功召开!

汇聚品牌力量&#xff0c;共同相聚成都。6月14日&#xff0c;由中国安全产业协会指导&#xff0c;中国安全产业协会应急创新分会、应急救援产业网联合主办&#xff0c;四川省消防协会协办的“一切为了安全”2024年中国应急(消防)品牌巡展-成都站成功举办。该巡展旨在展示中国应…...

ansible-Role角色批量按照node_export节点,并追加信息到Prometheus文件中

文章目录 剧本功能 inventory.yaml文件定义deploy.yaml角色定义node_exporter_lock角色定义任务角色main.yamlnode_exporter_tasks.yml角色触发任务notifyextra_tasks.yml角色prometheus_node_config.j2模板文件 执行命令查看变量 剧本功能 功能1&#xff1a; 批量执行node_ex…...

求最小公倍数 、小球走过路程计算 题目

题目 JAVA11 求最小公倍数分析&#xff1a;代码&#xff1a;大佬代码&#xff1a; JAVA12 小球走过路程计算分析&#xff1a;代码&#xff1a; JAVA11 求最小公倍数 描述 编写一个方法&#xff0c;该方法的返回值是两个不大于100的正整数的最小公倍数。 输入描述&#xff1a;…...

【Android面试八股文】你能说一说为什么IO是耗时操作?

IO(输入/输出)操作之所以是耗时操作,主要是由于以下几个原因: 1. 物理设备的限制 机械动作:传统的硬盘驱动器(HDD)包含旋转的磁盘和移动的磁头,以读取或写入数据。这些机械动作需要时间完成。虽然固态硬盘(SSD)没有机械部件,但它们仍然受到电子信号传输速度的限制。…...

怎样增强 CLike 游戏的社交功能,促进玩家之间的互动和交流?

要增强CLike游戏的社交功能&#xff0c;以促进玩家之间的互动和交流&#xff0c;可以考虑以下几个方面&#xff1a; 添加聊天功能&#xff1a;在游戏中加入实时聊天功能&#xff0c;让玩家可以在游戏内互相交流。可以通过文本聊天或者语音聊天来实现。 社交平台集成&#xff1…...

12_YouOnlyLookOnce(YOLOv3)新一代实时目标检测技术

1.1 回顾V1和V2 V1&#xff1a;05_YouOnlyLookOnce(YOLOV1)目标检测领域的革命性突破-CSDN博客 V2&#xff1a;07_YouOnlyLookOnce(YOLOv2)Better&#xff0c;Faster&#xff0c;Stronger-CSDN博客 1.2 简介 YOLOv3&#xff08;You Only Look Once version 3&#xff09;是…...

安装 Nuxt.js 的步骤和注意事项

title: 安装 Nuxt.js 的步骤和注意事项 date: 2024/6/17 updated: 2024/6/17 author: cmdragon excerpt: Nuxt.js在Vue.js基础上提供的服务器端渲染框架优势&#xff0c;包括提高开发效率、代码维护性和应用性能。指南详细说明了从环境准备、Nuxt.js安装配置到进阶部署技巧&…...

【perl】环境搭建

1、Vscode Strawberry Perl 此过程与tcl环境搭建很类似&#xff0c;请参考我的这篇文章&#xff1a; 【vscode】 与 【tclsh】 联合搭建tcl开发环境_tclsh软件-CSDN博客 perl语言的解释器可以选择&#xff0c;strawberry perl。Strawberry Perl for Windows - Releases。 …...

【车载音视频AI电脑】全国产海事船载视频监控系统解决方案

海事船载视频监控系统解决方案针对我国快速发展的内河航运、沿海航运和远洋航运中存在的航行安全和航运监管难题&#xff0c;为船舶运营方、政府监管部门提供一套集视频采集、存储、回放调阅为一体的视频监控系统&#xff0c;对中大型船舶运行中的内部重要部位情况和外部环境进…...

Centos SFTP搭建

SFTP配置、连接及挂载教程_sftp连接-CSDN博客1、确认是否安装yum list installed | grep openssh-server 2、创建用户和组 sudo groupadd tksftpgroup sudo useradd -g tksftpgroup -d /home/www/tk_data -s /sbin/nologin tksftp01 sudo passwd tksftp013. 配置SFTP注意&a…...

【中学教资科目二】01教育基础

01教育基础 前言第一节 教育的产生与发展1.1 教育的起源 第二节 教育学的产生和发展2.1 中国教育学的发展2.2 西方教育学的发展2.3 独立及多样化阶段2.4 马克思教育学2.5 现代教育发展 第三节 教育与社会的发展3.1 教育与文化的关系 第四节 教育与人的发展、4.1 个体身心发展的…...

设计模式-享元模式Flyweight(结构型)

享元模式(Flyweight) 享元模式是一种结构型模式&#xff0c;它主要用于减少创建对象的数量&#xff0c;减少内存占用。通过重用现有对象的方式&#xff0c;如果未找到匹配对象则新建对象。线程池、数据库连接池、常量池等池化的思想就是享元模式的一种应用。 图解 角色 享元工…...

泰安网站设计/今天发生了什么重大新闻

转载自&#xff1a;http://msdn.microsoft.com/zh-cn/library/system.badimageformatexception%28vvs.100%29.aspx BadImageFormatException 类 当动态链接库 (DLL) 或可执行程序的文件映像无效时引发的异常。 解决办法&#xff1a; DLL 或可执行文件作为 64 位程序集加载&…...

网站免备案空间/网络seo营销推广

1.Path注解 Path 注解可以标记在类名之上&#xff0c;也可以标记在方法名上。该注解接收一个value参数&#xff0c;表示定义资源的地址。 另外&#xff0c;资源地址相同&#xff0c;但是HTTP方法不同的两个方法是完全两个不同的REST接口&#xff0c;HTTP方法和资源地址相结合…...

临沂网站建设设计公司/百度seo技术优化

懒惰像生锈一样&#xff0c;比操劳更能消耗身体&#xff1b;经常用的钥匙&#xff0c;总是亮闪闪的。 ——富兰克林...

购物网站的排版/太原网站快速排名优化

软考中级网络工程师笔记&#xff08;九&#xff09; ——网络互连与互联网&#xff08;二&#xff09;IP子网划分专题 考点一&#xff1a;   IP地址&#xff1a;4个字节32位。每一个8位位组用0&#xff5e;255表示。因此&#xff0c;最小的IP地址值为0.0.0.0&…...

产品图案设计网站/搜索引擎营销特点是什么

目录 概述 安装MyQR 模块使用 模块参数介绍 简单的二维码 带图片的二维码 带动态图片的二维码 其他参数 概述 MyQR模块可以生成个性化的二维码图片。 安装MyQR 如果没有安装&#xff0c;那么就需要安装&#xff1a;pip install MyQR。 MyQR安装成功判断 模块使用 …...

做高端品牌网站/高端网站建设企业

1、引言 HitTest是命中测试的意思。在使用MFC编程的时候&#xff0c;在列表视图中通常会涉及到需要获取鼠标当前位置所对应的元素。这种通过光标位置来获得相应元素项的操作我们称之为命中测试。 2、获取光标位置 网上有人这样处理&#xff1a; DWORDdwPos ::GetMessagePos(…...