多线程和并发

线程

进程:在操作系统中运行的程序,一个进程可以包含多个线程
程序就是指令和数据的有序集合,静态概念
进程就是执行程序的一次执行过程,动态概念系统资源分配的单元

一个进程中包含多个线程,一个进程至少包含一个线程
线程时cpu调度和执行的单位
线程是独立的执行路径
程序运行时,即使没有自己创建线程。后台也会有多个线程,如主线程,gcxianc
main()是主线程,为系统的入口,用于执行整个程序
在一个进程中如果开辟了多个线程,线程的运行由调度器进行安排调度,调度器与操作系统密切相关,先后顺序不能干预
对同一份资源操作时,会存在资源抢夺的问题,加入并发控制
线程会带来额外的开销
每个线程对自己的工作内存交互,内存控制不当会造成数据不一致

线程创建Thread、Runnable、Callable

继承Thread

1.自定义线程类继承Thread类
重新run()方法,编写线程执行体
创建线程对象,调用start方法();

使用Thread实现网图下载:

package com.ty.threadAndRunableAndCallable;import org.apache.commons.io.FileUtils;import java.io.File;
import java.io.IOException;
import java.net.URL;public class ThreadDownLoader extends Thread {private String url;//网图地址private String fileName;//public ThreadDownLoader(String url,String fileName){this.url = url;this.fileName = fileName;}@Overridepublic void run(){WebDownLoader webDownLoader = new WebDownLoader();webDownLoader.downLoader(url,fileName);System.out.println("文件名:"+ fileName);}public static void main(String[] args) {ThreadDownLoader t1 = new ThreadDownLoader("https://pic.rmb.bdstatic.com/bjh/914b8c0f9814b14c5fedeec7ec6615df5813.jpeg", "1.jpeg");ThreadDownLoader t2 = new ThreadDownLoader("https://n.sinaimg.cn/sinakd2020723s/213/w2048h1365/20200723/3918-iwtqvyk4060964.jpg", "2.jpg");ThreadDownLoader t3 = new ThreadDownLoader("https://file.ccmapp.cn/group1/M00/16/64/rApntl7CSdeAbpYqABArOjGaasg001.jpg", "3.jpg");t1.start();t2.start();t3.start();}
}class WebDownLoader{public void downLoader(String url,String fileName){try {FileUtils.copyURLToFile(new URL(url),new File(fileName));} catch (IOException e) {e.printStackTrace();System.out.println("IO exception!!! downLoader Error!!!");}}
}

实现Runnable

定义MyRunnable类实现Runnable接口
实现run()方法,编写线程体
创建线程对象,调用start()方法启动线程

Thread和Runnable区别

Thread不建议使用,避免OOP单继承局限,
Runnable具有多线程能力
启动线程:传入目标对象+Thread对象.start()
推荐是哦哟牛皋,避免单继承的局限性,灵活方便,方便同一个对象被多个线程使用

多线程模拟出票:并发问题

package com.ty.threadAndRunableAndCallable;public class ConcurrencyQuestion implements Runnable {private int tickerNums = 10;@Overridepublic void run() {while (true){if (tickerNums <= 0){break;}try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"拿到了,第"+(tickerNums--)+"票");}}public static void main(String[] args) {ConcurrencyQuestion concurrencyQuestionTicker = new ConcurrencyQuestion();new Thread(concurrencyQuestionTicker,"aa").start();new Thread(concurrencyQuestionTicker,"bb").start();new Thread(concurrencyQuestionTicker,"cc").start();}}

多线程模拟龟兔赛跑

在这里插入图片描述

package com.ty.threadAndRunableAndCallable;public class ConcurrencyRace implements Runnable{private String winner;@Overridepublic void run() {for (int i = 1; i <= 100; i++) {//模拟兔子休息if (Thread.currentThread().getName().equals("兔子") && i % 2 == 0){try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}boolean flag = gameOver(i);while (flag){break;}System.out.println(Thread.currentThread().getName()+"--->跑了"+i+"步");}}//判断游戏胜利private boolean gameOver(int gepts){if (winner != null){return true;}if (gepts == 100){System.out.println("=============");winner = Thread.currentThread().getName();System.out.println("winner is "+ winner);return true;}System.out.println("=====w========");return false;}public static void main(String[] args) {ConcurrencyRace race = new ConcurrencyRace();new Thread(race,"兔子").start();new Thread(race,"乌龟").start();}
}

实现Callable

在这里插入图片描述

package com.ty.threadAndRunableAndCallable;import org.apache.commons.io.FileUtils;import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class CallableWebDownLoader implements Callable<Boolean> {private String url; //网图地址private String name;//保存地址public CallableWebDownLoader(String url,String name){this.url = url;this.name = name;}@Overridepublic Boolean call() throws Exception {WebDownLoaderUseCallable callable = new WebDownLoaderUseCallable();callable.downLoader(url,name);System.out.println("文件名: "+ name);return true;}public static void main(String[] args) {CallableWebDownLoader c1 = new CallableWebDownLoader("https://pic.rmb.bdstatic.com/bjh/914b8c0f9814b14c5fedeec7ec6615df5813.jpeg","D:\\software\\JavaCode\\javaSE\\JavaSE01\\src\\com\\ty\\threadAndRunableAndCallable\\1.jpeg");CallableWebDownLoader c2 = new CallableWebDownLoader("" +"https://n.sinaimg.cn/sinakd2020723s/213/w2048h1365/20200723/3918-iwtqvyk4060964.jpg","D:\\software\\JavaCode\\javaSE\\JavaSE01\\src\\com\\ty\\threadAndRunableAndCallable\\2.jpg");CallableWebDownLoader c3 = new CallableWebDownLoader("https://file.ccmapp.cn/group1/M00/16/64/rApntl7CSdeAbpYqABArOjGaasg001.jpg","D:\\software\\JavaCode\\javaSE\\JavaSE01\\src\\com\\ty\\threadAndRunableAndCallable\\3.jpg");ExecutorService es = Executors.newFixedThreadPool(1);es.submit(c1);es.submit(c2);es.submit(c3);es.shutdown();}
}
class WebDownLoaderUseCallable{public void downLoader(String url,String name) {try {FileUtils.copyURLToFile(new URL(url),new File(name));} catch (IOException e) {e.printStackTrace();System.out.println("IO Exception, DownLoad Error!!!");}}
}

静态代理

真是对象和代理对象都要实现一个接口
代理对象要代理真是对象
好处:代理对象可以做真实对象做不了的事情,真实对象可以专注做自己的事情

package com.ty.threadAndRunableAndCallable;public class staticProxy {public static void main(String[] args) {HappyCompany happyCompany = new HappyCompany(new You());happyCompany.HappyMarry();}}
interface Marry{void HappyMarry();
}
//真实角色
class You implements Marry {@Overridepublic void HappyMarry() {System.out.println("结婚了!我们结婚了!!!");}
}
//代理角色
class HappyCompany implements Marry{private Marry target;public HappyCompany(Marry target){this.target = target;}@Overridepublic void HappyMarry() {after();this.target.HappyMarry();before();}private void after() {System.out.println("布置现场。。。。");}private void before() {System.out.println("收拾现场。。。。。");}
}

线程状态

在这里插入图片描述
五大状态:创建状态、就绪状态、阻塞状态、死亡状态、运行状态

线程执行流程

在这里插入图片描述

线程方法

在这里插入图片描述

停止线程

并不推荐使用stop(),destroy()
推荐线程自己停下来
建议使用一个标志位进行终止变量,flag=false 则终止线程

线程休眠Sleep

在这里插入图片描述

package com.ty.threadAndRunableAndCallable;import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;public class CountDown{private static void countDown(){int count = 10;while (true){try {Thread.sleep(1000);count--;if (count<0){break;}System.out.println(count);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {//countDown();ControlTime();}//打印系统时间private static void ControlTime(){Date date = new Date(System.currentTimeMillis());//打印系统时间while (true){try {Thread.sleep(1000);System.out.println(new SimpleDateFormat("HH:dd:ss").format(date));date = new Date(System.currentTimeMillis());} catch (InterruptedException e) {e.printStackTrace();}}}}

线程礼让 yield

在这里插入图片描述

package com.ty.threadAndRunableAndCallable;public class ThreadYield {public static void main(String[] args) {Yield yield = new Yield();new Thread(yield,"a").start();new Thread(yield,"b").start();}
}
class Yield implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"线程执行");Thread.yield();System.out.println(Thread.currentThread().getName()+"线程结束");}
}

合并线程Join

待此线程执行结束后,在执行其他线程,其他线程阻塞
可以想象成插队

package com.ty.threadAndRunableAndCallable;public class ThreadJoin implements Runnable{@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println("vip 来了"+i);}}public static void main(String[] args) {ThreadJoin join = new ThreadJoin();Thread thread = new Thread(join);thread.start();for (int i = 0; i < 20; i++) {if (i==10){try {thread.join();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("main----"+i);}}
}

线程状态观测

在这里插入图片描述
一个线程可以在给定时间点处于一个状态,这些状态时不反应任何操作系统线程状态的虚拟机状态

package com.ty.threadAndRunableAndCallable;public class ThreadState {public static void main(String[] args) {Thread thread = new Thread(()->{for (int i = 0; i < 5; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("=============");});//观察线程状态Thread.State state = thread.getState();System.out.println(state); // newthread.start();state = thread.getState();System.out.println(state);//runwhile (state != Thread.State.TERMINATED){//Thread.State.TERMINATED 线程不终止try {Thread.sleep(100);state = thread.getState();System.out.println(state);} catch (InterruptedException e) {e.printStackTrace();}}}
}

线程优先级

在这里插入图片描述

package com.ty.threadAndRunableAndCallable;public class ThreadPriority {public static void main(String[] args) {getThreadPriority getThreadPriority = new getThreadPriority();Thread t1 = new Thread(getThreadPriority);Thread t2 = new Thread(getThreadPriority);Thread t3 = new Thread(getThreadPriority);Thread t4 = new Thread(getThreadPriority);Thread t5 = new Thread(getThreadPriority);Thread t6 = new Thread(getThreadPriority);t1.setPriority(1);t1.start();t2.setPriority(3);t2.start();t3.setPriority(5);t3.start();t4.setPriority(7);t4.start();t5.setPriority(Thread.MAX_PRIORITY);t5.start();t6.start();}
}
class getThreadPriority implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"-----"+Thread.currentThread().getPriority());}
}

守护线程demon

在这里插入图片描述

线程同步

并发:多个线程同时操作同一资源
由于同一进程的多个线程共享同一块内存空间,方便的同时也带来了访问冲突问题,为了保证数据在方法中被访问时的正确性,访问时,加入锁机制synchronized,当一个线程获得对象的排他锁,独占资源时,其他线程必选等待,使用后释放锁即可。
在这里插入图片描述

同步方法

在这里插入图片描述
在这里插入图片描述

同步块

同步块:synchronized() {}
在这里插入图片描述

同步块解决买票、银行取钱、集合不安全问题

//买票
package com.ty.threadAndRunableAndCallable.notSoft;public class ThreadNotSoftQuestion {public static void main(String[] args) {buyTicket buyTicket = new buyTicket();new Thread(buyTicket,"aa").start();new Thread(buyTicket,"bb").start();new Thread(buyTicket,"cc").start();}
}class buyTicket implements Runnable{private int num= 10;private boolean flag = true;@Overridepublic void run() {while (flag){buy();}}private synchronized void buy(){if (num <= 0){flag = false;return;}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"---抢到了第 "+(num--)+"张票");}
}
package com.ty.threadAndRunableAndCallable.notSoft;//银行取钱:两个人取钱
public class NotSoftBank {public static void main(String[] args) {Account account = new Account(100, "基金");Drawing you = new Drawing(account,50,"tt");Drawing girlFriend = new Drawing(account, 100, "yy");you.start();girlFriend.start();}
}
//银行
class Account{int money;// 余额String name;//卡号public Account(int money,String name){this.money = money;this.name = name;}
}//模拟取钱
class Drawing extends Thread{private Account account;//账户private int drawingMoney;//取了多少private int nowMoney;//现在剩余public Drawing(Account account,int drawingMoney,String name){super(name);this.account = account;this.drawingMoney = drawingMoney;}@Overridepublic void run(){synchronized (account){if (account.money - drawingMoney < 0){System.out.println(Thread.currentThread().getName()+"余额不足,无法取出");return;}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//余额account.money = account.money - drawingMoney;//手里nowMoney = nowMoney + drawingMoney;System.out.println(account.name+"余额为:"+account.money);System.out.println(this.getName()+"手里的钱:"+nowMoney);}}
}
package com.ty.threadAndRunableAndCallable.notSoft;import java.util.ArrayList;
import java.util.List;public class NotSoftList {public static void main(String[] args) {List<String> list = new ArrayList<>();for (int i = 0; i < 100; i++) {new Thread(()->{synchronized (list){list.add(Thread.currentThread().getName());}}).start();}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(list.size());}
}

死锁

在这里插入图片描述

避免死锁的四个方法

在这里插入图片描述

锁 Lock

在这里插入图片描述

synchronized和lock的区别

在这里插入图片描述

线程协作

##线程通信
在这里插入图片描述
均是Object类的方法,都只能在同步方法或者同步代码块中使用,否则就会抛出异常。

线程池

在这里插入图片描述
corePoolSize:核心池的大小
maximumPoolSize:最大线程数
keepAliveTime:线程没有任务时最多保持多长时间会终止
在这里插入图片描述

package com.ty.threadAndRunableAndCallable;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;//线程池
public class pool {public static void main(String[] args) {poolTest poolTest = new poolTest();ExecutorService es = Executors.newFixedThreadPool(10);es.submit(poolTest);es.submit(poolTest);es.submit(poolTest);es.submit(poolTest);es.shutdown();}
}
class poolTest implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName());}
}

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

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

相关文章

大蟒蛇(Python)笔记(总结,摘要,概括)——第9章 类

目录 9.1 创建和使用类 9.1.1 创建Dog类 9.1.2 根据类创建实例 9.2 使用类和实例 9.2.1 Car类 9.2.2 给属性指定默认值 9.2.3 修改属性的值 9.3 继承 9.3.1 子类的_init_()方法 9.3.2 给子类定义属性和方法 9.3.3 重写父类中的方法 9.3.4 将实例用作属性 9.3.5 模拟实物 9.…

现货黄金中短线投资该怎么做?

要明确什么是现货黄金的中短线投资&#xff0c;中短线投资是指在短期内&#xff08;一般为几天至几周&#xff09;对现货黄金进行买卖操作&#xff0c;以期获得收益的投资方式。相较于长线投资&#xff0c;中短线投资的风险相对较大&#xff0c;但同时收益也更为可观。那么&…

二手货wordpress企业网站主题模板

二手车wordpress主题模板 简洁的二手车wordpress主题模板&#xff0c;适合做二手车业务的公司官方网站使用。 https://www.jianzhanpress.com/?p3473 wordpress二手物资回收主题 绿色wordpress二手物资回收主题&#xff0c;用于二手物资回收公司WP建站使用。 https://www.…

自动化行业文件数据\资料防泄密软件——天锐绿盾|@德人合科技

天锐绿盾是一款自动化行业文件数据防泄密软件&#xff0c;由德人合科技提供。该软件采用动态加解密技术&#xff0c;能够有效防止公司内部数据泄密&#xff0c;同时支持各种文件格式加密&#xff0c;如CAD、OFFICE、PDF、图纸等。 PC端&#xff1a;https://isite.baidu.com/sit…

Linux RocketMQ 安装及卸载(附控制台搭建)

一、前言 在安装 RocketMQ 前需要确保 JDK 已安装并正确配置环境变量 二、下载安装 1.下载 下载 | RocketMQ 2.安装 # 打开存放目录 cd /usr/local # 创建目录 mkdir rocketMQ # 进入目录 cd rocketMQ # 把下载的压缩包上传到 rocketMQ 目录中 # 解压 $ unzip rocketmq-all-…

高级RAG:揭秘PDF解析

原文地址&#xff1a;https://pub.towardsai.net/advanced-rag-02-unveiling-pdf-parsing-b84ae866344e 2024 年 2 月 3 日 附加内容&#xff1a;揭秘PDF解析&#xff1a;如何从科学pdf论文中提取公式 对于RAG&#xff0c;从文档中提取信息是一个不可避免的场景。确保从源头…

Python 在Word中创建表格并填入数据、图片

在Word中&#xff0c;表格是一个强大的工具&#xff0c;它可以帮助你更好地组织、呈现和分析信息。本文将介绍如何使用Python在Word中创建表格并填入数据、图片&#xff0c;以及设置表格样式等。 Python Word库&#xff1a; 要使用Python在Word中创建或操作表格&#xff0c;需…

OpenCV 4基础篇| OpenCV图像基本操作

目录 1. 图像读取1.1 cv2.imread() 不能读取中文路径和中文名称1.2 cv2.imdecode() 可以读取中文路径和中文名称 2. 图像的显示2.1 openCV显示图像 cv2.imshow()2.2 matplotlib显示图像 plt.imshow() 3. 图像的保存 cv2.imwrite()4. 图像的复制4.1 img.copy()4.2 np.copy()4.3 …

【C++STL】STL容器详解

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

个性化纹身设计,Midjourney带你探索独一无二的艺术之美

hello,大家好&#xff0c;欢迎回来。 在当今社会&#xff0c;纹身已经变得非常常见。 在寻求与众不同的个性化纹身时&#xff0c;你是否曾经为了找不到独特的设计而苦恼&#xff1f; 现在&#xff0c;Midjourney将为你打开一扇全新的艺术之门&#xff0c;引领你探索纹身设计…

高通 Android 12 Settings不显示版本号问题

1、最近项目遇到一个奇葩问题&#xff0c;编译系统版本号不见了&#xff1f; 2、一开始我想着可能是自己代码没有make clean结果编译几个小时&#xff0c;然后烧录固件发现还是未生效。 3、然后这时候我又去看git log review最近修改也没有太大发现&#xff08;待定&#xff…

docker安装flink

docker安装flink 5.1、拉取flink镜像&#xff0c;创建网络 docker pull flink docker network create flink-network5.2、创建 jobmanager # 创建 JobManager docker run \-itd \--namejobmanager \--publish 8081:8081 \--network flink-network \--env FLINK_PROPERTIES&…

ArcgisForJS如何在线编辑ArcGIS Server发布的几何要素?

文章目录 0.引言1.ArcGIS创建几何要素2.ArcGIS Server发布几何要素3.ArcgisForJS在线编辑ArcGIS Server发布的几何要素 0.引言 ArcGIS For JS 是一种用于创建和编辑地理信息的 JavaScript 库&#xff0c;它允许用户在线编辑 ArcGIS Server 发布的几何要素。本文从ArcGIS创建几…

07 MyBatis之高级映射 + 懒加载(延迟加载)+缓存

1. 高级映射 例如有两张表, 分别为班级表和学生表 自然, 一个班级对应多个学生 像这种数据 , 应该如果如何映射到Java的实体类上呢? 这就是高级映射解决的问题 以班级和学生为例子 , 因为一个班级对应多个学生 , 因此学生表中必定有一个班级编号字段cid 但我们在学生的实体…

Yolov9全文翻译!

Yolo v9全文翻译 论文链接&#xff1a;&#x1f47f; YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 代码链接&#xff1a;&#x1f47f; https://github.com/WongKinYiu/yolov9/tree/main 大量图片来袭&#xff01;

为什么说抖店适合电商新手入局?门槛及运营玩法,今天一文详解!

大家好&#xff0c;我是电商小布。 现在&#xff0c;越来越多的人开始加入到了电商这个行业&#xff0c;原因就是看到了它发展的可能性。 而抖音小店这个项目&#xff0c;作为近几年发展势头非常猛的电商项目&#xff0c;成为了很多小伙伴们的首选。 为什么会这样呢&#xf…

抖音数据抓取工具|视频内容提取软件

引言部分&#xff1a; 介绍针对抖音视频下载需求开发的强大工具突出解决用户获取抖音视频繁琐问题的初衷 工具功能介绍&#xff1a; 详细描述工具功能&#xff0c;包括关键词搜索、自动批量抓取、选择性批量下载等提及基于C#开发的优势以及支持通过分享链接进行单个视频抓取…

10:部署Dashboard|部署Prometheus|HPA集群

部署Dashboard&#xff5c;部署Prometheus&#xff5c;HPA集群 Dashboard部署Dashboard上传镜像到私有仓库安装服务发布服务创建管理用户查看登录的Token信息 Prometheus步骤一&#xff1a;导入所有后续需要的镜像到私有镜像仓库&#xff08;在master主机操作操作&#xff09;步…

【区块链】智能交易模式下的数据安全流通模型

【区块链】智能交易模式下的数据安全流通模型 写在最前面**区块链智能交易模式概述****数据安全流通的挑战****数据安全流通模型的核心要素****实现数据安全流通的区块链技术****区块链智能交易模式下数据安全流通模型的设计原则****数据安全流通模型的应用案例分析****面临的挑…

ONLYOFFICE8.0——赋能办公

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-xdAoM2pHRmDFP0tF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…