Java多线程实战

Java多线程实战

java多线程(超详细)
java自定义线程池总结

Java创建线程方式

  • 方法1,继承Thread类

  • 方法2,实现Runable接口

  • 方法2-2,匿名内部类形式+lambda表达式

  • 方法3,实现Callable接口,允许有返回值

  • 方法4,线程池方式
    常见线程池:
    在这里插入图片描述

public class ThreadTest {public static void main(String[] args) {// 方法一MyThread myThread = new MyThread();myThread.start();// 方法2MyRunable myRunable = new MyRunable();Thread thread = new Thread(myRunable);thread.start();// 方法2-2Thread thread1 = new Thread(() -> {try {Thread.sleep(5);System.out.println(Thread.currentThread().getName() + "匿名线程形式运行中");Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}});thread1.start();// 方法3MyCallable myCallable = new MyCallable();FutureTask futureTask = new FutureTask<>(myCallable);Thread thread2 = new Thread(futureTask);thread2.start();try {Object o = futureTask.get();System.out.println(o);} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}// 方法4-线程池,常有线程池ExecutorService threadPool = Executors.newFixedThreadPool(10);threadPool.execute(myThread);threadPool.execute(myRunable);Future<?> ret = threadPool.submit(() -> {try {Thread.sleep(5);System.out.println(Thread.currentThread().getName() + "Callable形式运行中");Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}return "yangshun";});try {System.out.println(ret.get());} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}threadPool.shutdown();// 方法4-2:自定义线程池ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 				//coreSize2, 				//MaxSize60, 			//60TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(3),			//指定一种队列 (有界队列),new ThreadPoolExecutor.CallerRunsPolicy()                          //自定义拒绝策略//, new DiscardOldestPolicy()               //可以使用默认拒绝策略);ThreadPoolExecutor executor = new ThreadPoolExecutor(// 核心线程数3,// 最大线程数5,// 空闲线程最大存活时间60L,// 空闲线程最大存活时间单位TimeUnit.SECONDS,// 等待队列及大小new ArrayBlockingQueue<>(100),// 创建新线程时使用的工厂Executors.defaultThreadFactory(),// 当线程池达到最大时的处理策略
//                new ThreadPoolExecutor.AbortPolicy()          // 抛出RejectedExecutionHandler异常new ThreadPoolExecutor.CallerRunsPolicy()       // 交由调用者的线程执行
//                new ThreadPoolExecutor.DiscardOldestPolicy()  // 丢掉最早未处理的任务
//                new ThreadPoolExecutor.DiscardPolicy()        // 丢掉新提交的任务);// 总共5个任务for (int i = 1; i <= 5; i++) {int taskIndex = i;executor.execute(() -> {System.out.println("线程 " + Thread.currentThread().getName() + " 正在执行任务 " + taskIndex);// 每个任务耗时1秒try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}});}executor.shutdown();System.out.println("主线程运行结束");}@Testpublic void test() {ExecutorService threadPool = Executors.newCachedThreadPool();for(int i = 0; i < 100; i++) {try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}threadPool.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "正在执行中。。。");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});}threadPool.shutdown();}}
class MyCallable implements Callable{@Overridepublic Object call() throws Exception {try {Thread.sleep(5);System.out.println(Thread.currentThread().getName() + "Callable形式运行中");Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}return "运行成功!yes";}
}
class MyThread extends Thread {@Overridepublic void run() {try {Thread.sleep(5);System.out.println(Thread.currentThread().getName() + "运行中");Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}}
}class MyRunable implements Runnable {@Overridepublic void run() {try {Thread.sleep(5);System.out.println(Thread.currentThread().getName() + "Runable形式运行中");Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}}
}

SpringBoot创建线程方式

【并发编程】SpringBoot创建线程池的六种方式

java并发学习–第二章 spring boot实现线程的创建

CompletableFuture使用

Java多线程(十): FutureTask CompletableFuture详解

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

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

相关文章

【深入理解Linux内核锁】三、原子操作

我的圈子: 高级工程师聚集地 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强企业! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录 1、原子操作思想2、整型变量原子操作2.1 API接口2.2 API实现2.2.1 原子变量结…

Shell 函数

Shell 函数 linux shell 可以用户定义函数&#xff0c;然后在shell脚本中可以随便调用。 shell中函数的定义格式如下&#xff1a; [ function ] funname [()] { action; [return int;] } 说明&#xff1a; 1、可以带function fun() 定义&#xff0c;也可以直接fun…

log4j:WARN No appenders could be found for logger问题

本文将idea场景下的使用。 IDEA中&#xff0c;将配置文件命名为log4j.properties&#xff08;该命名才会被自动加载&#xff09;&#xff0c; 并放到某个目录下&#xff08;通常放到resources目录&#xff09;&#xff0c;并在resources上右键&#xff0c;找到Mark Directory a…

微信程序 自定义遮罩层遮不住底部tabbar解决

一、先上效果 二 方法 1、自定义底部tabbar 实现&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/framework/ability/custom-tabbar.html 官网去抄 简单写下&#xff1a;在代码根目录下添加入口文件 除了js 文件的list 需要调整 其他原封不动 代码&#xf…

Hadoop数据迁移distcp

Hadoop数据迁移distcp 准备工作 确认源集群&#xff08;a&#xff09;,目标集群&#xff08;b&#xff09;确认a集群的主节点和b集群的主节点确认两个集群的网络相通确认迁移模式&#xff08;全量迁移还是增量迁移&#xff09;&#xff0c;这里选择全量迁移 迁移文件 迁移t…

【路由协议】使用按需路由协议和数据包注入的即时网络模拟传递率(PDR)、总消耗能量和节点消耗能量以及延迟研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

斯坦福「小镇」开源AI智能体;小米应用商店将要求AI应用符合资质标准

&#x1f989; AI新闻 &#x1f680; 斯坦福「小镇」开源AI智能体 摘要:斯坦福研究人员开源了一个类似《西部世界》的数字化「小镇」,里面有25个AI智能体可以生活、工作、社交。这项研究被视为AGI的重要开端,可能会改变游戏、企业应用领域。网友期待这项技术改善游戏NPC的交互…

PyMuPDF`库实现PDF旋转功能

本文介绍了一个简单的Python应用程序&#xff0c;用于将PDF文件转换为旋转90度的PDF文件。主要用于csdn网站中导出的博客pdf是横向的&#xff0c;看起来不是很方便&#xff0c;才想到用python编制一个将pdf从横向转为纵向的功能。 功能 该PDF转换工具具有以下功能&#xff1a…

信息安全:防火墙技术原理与应用.

信息安全&#xff1a;防火墙技术原理与应用. 防火墙是网络安全区域边界保护的重要技术。为了应对网络威胁&#xff0c;联网的机构或公司将自己的网络与公共的不可信任的网络进行隔离&#xff0c;其方法是根据网络的安全信任程度和需要保护的对象&#xff0c;人为地划分若干安全…

C#工程建立后修改工程文件名与命名空间

使用之前的项目做二次开发&#xff0c;项目快结束的时候&#xff0c;需要把主项目的名称修改成我们想要的。 之前从来没有这么干过&#xff0c;记录一下。 步骤如下&#xff1a; 1&#xff1a;打开vs2010项目解决方案&#xff0c;重命名&#xff0c;如下图所示&#xff1a; …

SDP协议是什么,详解SDP协议

一、SDP协议简介 SDP&#xff08;Session Description Protocol&#xff09;是一种会话描述协议&#xff0c;用于描述多媒体会话的参数。它是一种文本协议&#xff0c;通常用于VoIP&#xff08;Voice over Internet Protocol&#xff09;和视频会议等应用中。SDP协议定义了一种…

Vue项目(购物车)

目录 购物车效果展示&#xff1a; 购物车代码&#xff1a; 购物车效果展示&#xff1a; 此项目添加、修改、删除数据的地方都写了浏览器都会把它存储起来 下次运行项目时会把浏览器数据拿出来并在页面展示 Video_20230816145047 购物车代码&#xff1a; 复制完代码&#xff0…

leetcode每日一题_2682.找出转圈游戏输家

2682.找出转圈游戏输家 题目: n 个朋友在玩游戏。这些朋友坐成一个圈&#xff0c;按 顺时针方向 从 1 到 n 编号。从第 i 个朋友的位置开始顺时针移动 1 步会到达第 (i 1) 个朋友的位置&#xff08;1 < i < n&#xff09;&#xff0c;而从第 n 个朋友的位置开始顺时针移…

设计模式之原型模式Prototype的C++实现

1、原型模式提出 在软件功能设计中&#xff0c;经常面临着“某些结构复杂的对象”的创建工作&#xff0c;且创建的对象想拥有其他对象在某一刻的状态&#xff0c;则可以使用原型模型。原型模型是通过拷贝构造函数来创建对象&#xff0c;并且该对象拥有其他对象在某一刻的状态。…

Docker基础入门:镜像、容器导入导出与私有仓库搭建

Docker基础入门&#xff1a;镜像导入导出与私有仓库搭建 一、 Docker镜像、容器的导入和导出1.1、Docker镜像的导出1.2、Docker镜像的载入1.3、Docker容器的导出1.4、Docker容器的导入 二、 镜像和容器导出和导入的区别:三、commit操作_本地镜像发布到阿里云3.1、commit操作有关…

ppt中线材相交接的地方,如何绘画

ppt中线材相交接的地方&#xff1a; 在ppt中绘画线材相互交接的地方&#xff1a; 1.1绘图工具中的“弧形” 1.2小技巧 “弧形”工具点一下&#xff0c;在ppt中如下 1.3拖动活动点进行调整图形 1.4绘画圆弧 1.5调整“圆弧”的大小&#xff0c;鼠标放在“黄色点”位置&#xf…

【JVM】垃圾回收算法

目录 一、判断对象已“死” 1.1、引用计数算法 1.2、可达性分析算法 1.3、引用的概念 二、垃圾收集算法理论 2.1、分代收集理论 三、垃圾收集算法 3.1、标记--清除算法 3.2、标记--复制算法 3.3、标记--整理算法 一、判断对象已“死” 在堆里面存放着Java世界中几乎所…

【数据结构】二叉搜索树

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f40c; 个人主页&#xff1a;蜗牛牛啊 &#x1f525; 系列专栏&#xff1a;&#x1f6f9;数据结构、&#x1f6f4;C &#x1f4d5; 学习格言&#xff1a;博观而约取&…

亿赛通电子文档安全管理系统任意文件上传漏洞复现

0x01 产品简介 亿赛通电子文档安全管理系统&#xff08;简称&#xff1a;CDG&#xff09;是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…