多线程实现

1.多线程:并发实现

主线程和子线程并行实现。

一个进程中有多个线程,可以同时进行多个任务。进程是系统分配的,线程的执行是由调度器决定的。

注意:线程开启不一定执行,由Cpu调度执行。

线程创建的三种方式:

Thread 类型:

子类继承Thread类,并重写了run方法,然后实例化子类然后调用start()方法。 会让多个子线程同时进行。

package com;/*** @author Lenovo* @date 2024/3/11* @time 8:49* @project Chapter01_Java_多线程**//*1. 实现线程的第一种方式: 集成Thread类2. 然后new一个子类的对象,然后调用start方法;*/
public class ThreadTest01 extends Thread{@Overridepublic void run() {for (int i = 0; i <100 ; i++) {System.out.println(i+"--我在写代码");}}//主线程main 和子线程threadTest01同时执行;public static void main(String[] args) {ThreadTest01 threadTest01 = new ThreadTest01();threadTest01.start();for (int i = 0; i <200 ; i++) {System.out.println(i+"**我在看书,别打扰我");}}}0**我在看书,别打扰我
1**我在看书,别打扰我
2**我在看书,别打扰我
3**我在看书,别打扰我
4**我在看书,别打扰我
5**我在看书,别打扰我
6**我在看书,别打扰我
7**我在看书,别打扰我
8**我在看书,别打扰我
9**我在看书,别打扰我
10**我在看书,别打扰我
11**我在看书,别打扰我
12**我在看书,别打扰我
13**我在看书,别打扰我
0--我在写代码
1--我在写代码
2--我在写代码
3--我在写代码
4--我在写代码
5--我在写代码
6--我在写代码
14**我在看书,别打扰我
15**我在看书,别打扰我
16**我在看书,别打扰我
17**我在看书,别打扰我
18**我在看书,别打扰我

Runnable 接口: (推荐使用)

实现:实现Runnable接口,重写run方法。然后实例化一个Runnable接口对象类,再实例化一个Thread()类,传入Runnable类的实例化对象。最后调用start()方法。

优势:避免单继承的局限性,可以一个对象被多个线程使用。

package com;/*** @author Lenovo* @date 2024/3/11* @time 9:02* @project Chapter01_Java_多线程**//** 1. 实现Runnable接口,并重写run方法2. 实例化runnbale的子类,传入到Thread实例化类种,并调用start方法;
*/
public class RunnableTest01 implements Runnable{@Overridepublic void run() {for (int i = 0; i < 200; i++) {System.out.println(i+"--我在写代码");}}public static void main(String[] args) {RunnableTest01 runnableTest01 = new RunnableTest01();new Thread(runnableTest01).start();//传入runnable的实例化,调用start方法for (int i = 0; i <500 ; i++) {System.out.println(i+"***我在看书,别打扰我");}}
}0***我在看书,别打扰我
0--我在写代码
1***我在看书,别打扰我
1--我在写代码
2***我在看书,别打扰我
2--我在写代码
3***我在看书,别打扰我
3--我在写代码
4***我在看书,别打扰我
4--我在写代码
5***我在看书,别打扰我
5--我在写代码
6***我在看书,别打扰我
6--我在写代码
7***我在看书,别打扰我
7--我在写代码
8***我在看书,别打扰我
9***我在看书,别打扰我
10***我在看书,别打扰我
11***我在看书,别打扰我
12***我在看书,别打扰我
13***我在看书,别打扰我
14***我在看书,别打扰我
15***我在看书,别打扰我
16***我在看书,别打扰我
17***我在看书,别打扰我

问题:并发条件下,多线程同时访问一个资源,会造成数据紊乱,出现一个资源被多个人占用的问题。典型的买票。
package com;import javax.swing.plaf.synth.SynthOptionPaneUI;/*** @author Lenovo* @date 2024/3/11* @time 9:10* @project Chapter01_Java_多线程**/
public class RunnabTest02 implements Runnable{private int ticket=10;@Overridepublic void run() {while (true){if (ticket<=0){break;}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"买了第"+ticket--+"张票");}}public static void main(String[] args) {//一份资源RunnabTest02 runnabTest02 = new RunnabTest02();//可以有多个代理:实现new Thread(runnabTest02,"小明").start();new Thread(runnabTest02,"小芳").start();new Thread(runnabTest02,"黄牛党").start();}
}

龟兔赛跑的例子:

package com;/*** @author Lenovo* @date 2024/3/11* @time 9:39* @project Chapter01_Java_多线程**/
public class Race implements Runnable {private stadia

Callable 接口: (了解):创建服务,提交服务,获取结果,关闭服务。

静态代理模式:
  1. 真实对象和代理对象都要实现同一个接口
  2. 代理对象代理真实对象,真实对象只用做自己的事情,不用分心。

好处:代理对象可以做很多真实对象做不了的事情,而真实对象只用专心做自己的事情。


package com;/*** @author Lenovo* @date 2024/3/11* @time 10:31* @project Chapter01_Java_多线程**/
public class StaticProxy {public static void main(String[] args) {//一样的结构: lamda表达式:new Thread(()-> System.out.println("线程开始")).start();new WeddingCompany(new Human()).happyMarry();}
}
//结婚的接口:
interface Marry{void happyMarry();//方法:
}//真实对象
class Human implements Marry{@Overridepublic void happyMarry() {System.out.println("我要结婚了很开心");}
}//代理对象:都实现Marry接口
class WeddingCompany implements Marry{private Marry target;public WeddingCompany(Marry target) {this.target = target;}@Overridepublic void happyMarry() {before(); //结婚之前this.target.happyMarry();after(); //结婚之后}public void before(){System.out.println("结婚之前,布置现场");}public void after(){System.out.println("结婚之后,收尾款");}}

Lambda表达式:让代码更加简洁,避免匿名内部类过多。
  1. lambda表达式只能由一行代码的情况下才能简化成一行,如果有多行的,那就使用代码块包裹。
  2. 为lambda表达式的前提是接口为函数式接口(就是只能有一个抽象的方法)
  3. 多个参数也可以去掉参数的类型,如果要去掉就都去掉。如果有多个参数就需要加上就都加上。
package com;/*** @author Lenovo* @date 2024/3/11* @time 11:39* @project Chapter01_Java_多线程**/
public class LambdaTest01 {// 2. 静态内部类实现:static class love2 implements iLike{@Overridepublic void lambda(int a) {System.out.println(" i love you-->" + a);}}public static void main(String[] args) {//外部类iLike love = new love();love.lambda(2);//静态内部类:love2 love2 = new love2();love2.lambda(3);//3. 局部类:在一个类种还有一个类class love3 implements iLike{@Overridepublic void lambda(int a) {System.out.println(" i love you-->" + a);}}love3 love3 = new love3();love3.lambda(4);// 4. 匿名内部类: 没有类的名称,只能由接口或者父类实现:iLike love4 = new iLike(){@Overridepublic void lambda(int a) {System.out.println(" i love you-->" + a);}};love4.lambda(5);//5. lambda表达式实现:iLike love5=null;love5=(a)->{System.out.println(" i love you-->" + a);};love5.lambda(6);// 6. lambda简化:iLike love6=null;love6=a->{System.out.println(" i love you-->"+ a);};love6.lambda(7);}
}interface iLike{void lambda(int a);
}
//1. 外部类实现:
class  love implements iLike{@Overridepublic void lambda(int a) {System.out.println(" i love you-->" + a);}
}

线程停止:不使用JDK内置的stop,而是自己设置一个flag标志位进行线程的停止。
package com;/*** @author Lenovo* @date 2024/3/11* @time 12:13* @project Chapter01_Java_多线程**/
public class StopThread implements Runnable{//设置标志位:private  boolean flag=true;@Overridepublic void run() {int i =0;while (flag) {System.out.println("子线程运行了"+i++ + "次");}}//外部停止的方法public void stop(){this.flag=false;}public static void main(String[] args) {//创建线程StopThread thread1 = new StopThread();new Thread(thread1).start();for (int i = 0; i < 1000; i++) {System.out.println("main线程运行了"+i+"次");if( i == 900){thread1.stop(); //让flag为false;子线程结束System.out.println("子线程运行结束");}}}}

线程休眠:

Thread.sleep()方法。 每一个对象都有一把锁,sleep不会释放锁。

、package com;import java.text.SimpleDateFormat;
import java.util.Date;/*** @author Lenovo* @date 2024/3/11* @time 12:32* @project Chapter01_Java_多线程**/
public class ThreadSleep {public static void main(String[] args) throws InterruptedException {//模拟倒计时Date startTime = new Date(System.currentTimeMillis());while (true){//每次休眠1秒:Thread.sleep(1000);String time = new SimpleDateFormat("HH:mm:ss").format(startTime);System.out.println("当前系统时间为:"+time);startTime= new Date(System.currentTimeMillis());}}
}

线程礼让:Thread.yield()方法;礼让不一定成功。

线程强制执行: Thread.join() 方法;
package com;/*** @author Lenovo* @date 2024/3/11* @time 13:16* @project Chapter01_Java_多线程**/
public class ThreadJoin {public static void main(String[] args) throws InterruptedException {VipThread vipThread=new VipThread();Thread thread = new Thread(vipThread);thread.start();//主线程:for (int i = 0; i < 500; i++) {//当主线程执行200次后,子线程进行插队操作;if (i==200){thread.join();//插队}System.out.println("主线程执行:"+i+"次");}}
}class VipThread implements Runnable{@Overridepublic void run() {for (int i = 0; i < 1000; i++) {System.out.println("vip插队来了"+i);}}
}
观测线程状态:线程的五种状态:New 、Runnable、BLocked、Waiting、Time_waiting、terminated

线程一旦结束就不能重新开始!!!!!

package com;/*** @author Lenovo* @date 2024/3/11* @time 13:28* @project Chapter01_Java_多线程**/
public class ThreadState {public static void main(String[] args) throws InterruptedException {//子线程: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);thread.start();//开始线程:state = thread.getState();System.out.println("线程的当前状态是:"+state);//主线程//如果不是最后结束的状态:while (state != Thread.State.TERMINATED){Thread.sleep(1000);//更新线程状态:state=thread.getState();System.out.println("线程的当前状态是:"+state);}}
}

线程的优先级:优先级高的可能先跑,但不一定会先跑。先设置线程,再start()。一般是5,最高是10。

守护线程:

线程分为用户线程和守护线程。虚拟机必须要等待用户线程执行完毕,不用等待守护线程执行完毕。

package com;/*** @author Lenovo* @date 2024/3/11* @time 13:59* @project Chapter01_Java_多线程**/
public class ThreadDemon {public static void main(String[] args) {God god = new God();user user = new user();//实现Runnable接口:Thread thread = new Thread(god);thread.setDaemon(true);//守护线程启动thread.start();//用户线程启动:new Thread(user).start();}
}//守护线程
class God implements Runnable{@Overridepublic void run() {while (true){System.out.println("守护线程保佑着你。。。");}}
}//用户线程class user implements Runnable{@Overridepublic void run() {for (int i = 0; i < 365000; i++) {System.out.println("我还活着");}System.out.println("结束吧,good bye world");}
}

思考

有什么想法或心得体会,都可以拿出来分享下。

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

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

相关文章

HarmonyOS系统开发ArkTS常用组件文本输入及参数

TextInput文本输入组件&#xff0c;用于接收用户输入的文本内容。 1、TextInput组件的参数 TextInput(value?:{placeholder?: string|Resource , text?: string|Resource}) placeholder属性用于设置无输入时的提示文本text用于设置输入框当前的文本内容 Entry Component st…

20240316-2-协同过滤(collaborative filtering)

协同过滤(collaborative filtering) 直观解释 协同过滤是推荐算法中最常用的算法之一&#xff0c;它根据user与item的交互&#xff0c;发现item之间的相关性&#xff0c;或者发现user之间的相关性&#xff0c;进行推荐。比如你有位朋友看电影的爱好跟你类似&#xff0c;然后最…

【Review+预测】测试架构演进的曲折之路

文章目录 前言 一、“原始”阶段 二、“小打小闹”阶段 三、“小米加步枪”阶段 四、“摩托化部队”阶段 五、“骑兵连”阶段 六、“海军陆战队”阶段 七、“社区型组织”阶段 前言 近期公司的测试团队需要重新组织安排&#xff0c;本着谦虚谨慎的态度&#xff0c;我从…

代码随想录算法训练营 DAY 17 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

110.平衡二叉树 平衡二叉树的定义&#xff1a;任何节点的左右子树高度差绝对值不超过1 空树也是AVL! 确定遍历顺序&#xff1a; 求高度用后序&#xff0c;求深度用前序。&#xff08;取决于需不需要从下往上返回结果&#xff09; 先判断它是不是平衡二叉树 如果是就返回 如…

【CVTE 一面凉经Ⅰ】循环依赖如何解决

目录 一.&#x1f981; 开始前的废话二. &#x1f981; 什么是循环依赖&#xff1f;三. &#x1f981;Spring 容器解决循环依赖的原理是什么?五. &#x1f981; 三级缓存解决循环依赖的原理六. &#x1f981; 由有参构造方法注入属性的循环依赖如何解决&#xff1f;七.&#x…

vue3通过el-cascader实现动态菜单切换页面

如果只有一级菜单只会显示一个按钮 <div style"width: 100%; margin-top: 10px; display: flex; align-items: center; border-bottom: 1px solid #ccc;"><template v-for"(menu, index) in cascaderData" :key"index"><el-casc…

整数和浮点数在内存中存储

整数在内存中的存储 整数的2进制表⽰⽅法有三种&#xff0c;即原码、反码和补码。 对于整形来说&#xff0c;数据存放内存中的其实是补码。 在计算机系统中&#xff0c;数值一律用补码来表示和存储。原因是&#xff0c;使用补码&#xff0c;可以使符号位和数值域统一处理&am…

DUSt3R:简化三维重建

3D 重建是从二维 (2D) 图像创建对象或场景的 3D 虚拟表示的任务&#xff0c;可用于模拟、可视化或本地化等多种目的。 它广泛应用于计算机视觉、机器人和虚拟现实&#xff08;VR&#xff09;等多个领域。 在基本设置中&#xff0c;3D 重建方法输入一对图像 I1 和 I2&#xff0c…

关于Java对接网络验证+实践小例子,简单易懂

一个简单的网络验证小例子&#xff0c;各位大佬勿喷 突发奇想&#xff0c;如果一位A友找你拿一份 Working Fruits&#xff0c;但是你不想这位A友把你辛苦劳作、熬夜加点写出的代码分享他或她的另外一位朋友B友&#xff0c;也许并不是很有价值的一个小作业而已&#xff0c;但是就…

数据结构:详解【栈和队列】的实现

目录 1. 栈1.1 栈的概念及结构1.2 栈的实现1.3 栈的功能1.4 栈的功能的实现1.5 完整代码 2. 队列2.1 队列的概念及结构2.2 队列的实现2.3 队列的功能2.4 队列的功能的实现2.5 完整代码 1. 栈 1.1 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的…

模拟B\S服务器(扩展知识点)

3.2 模拟B\S服务器(扩展知识点) 模拟网站服务器&#xff0c;使用浏览器访问自己编写的服务端程序&#xff0c;查看网页效果。 案例分析 准备页面数据&#xff0c;web文件夹。 复制到我们Module中&#xff0c;比如复制到day08中 我们模拟服务器端&#xff0c;ServerSocket类…

SpringCloud Alibaba实战和源码(8)OpenFeign使用

1、 使用Feign实现远程HTTP调用 1.1、常见HTTP客户端 HttpClient HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 Http 协 议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 J…

RN开发搬砖经验之—处理“Duplicate class com.github.barteksc.pdfviewer“

问题信息 Duplicate class com.github.barteksc.pdfviewer.PDFView found in modules jetified-AndroidPdfViewer-3.1.0-beta.3-runtime (com.github.TalbotGooday:AndroidPdfViewer:3.1.0-beta.3) and jetified-android-pdf-viewer-2.8.2-runtime (com.github.barteksc:andro…

为车主提供多路况安全保障!“北欧轮胎安全专家”熊牌轮胎迎来全新升级

德国马牌轮胎旗下明星品牌——Gislaved熊牌轮胎迎来全新升级。 自进入中国市场以来&#xff0c;熊牌轮胎凭借着坚韧安全、静音降噪等特点&#xff0c;收获无数好评。此次全新升级的熊牌轮胎&#xff0c;在品牌logo中加入了“北欧棕熊”的形象&#xff0c;并且对此前轮胎标签中的…

qt使用Windows经典风格,以使QTreeView或QTreeWidge有节点线或加号

没有使用Windows经典风格的QTreeView或QTreeWidget显示如下&#xff1a; 使用Windows经典风格的QTreeView或QTreeWidget显示如下&#xff1a; 树展开时&#xff1a; 树未展开时&#xff1a; 可以看到&#xff1a; 未使用Windows经典风格时&#xff0c;QTreeView或QTreeWidget…

【MySQL】基本查询(1)

【MySQL】基本查询&#xff08;1&#xff09; 目录 【MySQL】基本查询&#xff08;1&#xff09;表的增删改查Create单行数据 全列插入多行数据 指定列插入插入否则更新替换 RetrieveSELECT 列全列查询指定列查询查询字段为表达式为查询结果指定别名结果去重 WHERE 条件英语不…

第六篇:视频广告格式上传指南(上) - IAB视频广告标准《数字视频和有线电视广告格式指南》

第六篇&#xff1a; 视频广告格式和上传指南&#xff08;上&#xff09; --- 我为什么要翻译介绍美国人工智能科技公司IAB系列技术标准&#xff08;2&#xff09; 流媒体数字视频的广告格式分为线性和非线性两大类。任何一个广告都可以与显示在视频播放器外部的伴随横幅一起提…

【Linux文件系列】重定向

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

CMake学习(下)

1. 嵌套的CMake 如果项目很大&#xff0c;或者项目中有很多的源码目录&#xff0c;在通过CMake管理项目的时候如果只使用一个CMakeLists.txt&#xff0c;那么这个文件相对会比较复杂&#xff0c;有一种化繁为简的方式就是给每个源码目录都添加一个CMakeLists.txt文件&#xff…

windows系统下python进程管理系统

两年来&#xff0c;我们项目的爬虫代码大部分都是放在公司的windows机器上运行的&#xff0c;原因是服务器太贵&#xff0c;没有那么多资源&#xff0c;而windows主机却有很多用不上。为了合理利用公司资源&#xff0c;降低数据采集成本&#xff0c;我在所以任务机器上使用anac…