多线程基础学习

1. Runnable 接口

Runnable 是 Java 中用于定义线程任务的最基本接口。它没有返回值,仅包含一个 run() 方法。

示例
public class RunnableExample implements Runnable {@Overridepublic void run() {System.out.println("线程任务正在执行...");}public static void main(String[] args) {Thread thread = new Thread(new RunnableExample());thread.start(); // 启动线程}
}

2. Callable<V> 接口

CallableRunnable 的增强版,允许线程任务有返回值并抛出异常。Callable 适用于需要计算结果的任务。

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;public class CallableExample implements Callable<Integer> {@Overridepublic Integer call() throws Exception {// 模拟计算任务return 42;}public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executor = Executors.newSingleThreadExecutor();Future<Integer> result = executor.submit(new CallableExample());System.out.println("计算结果: " + result.get()); // 输出 42executor.shutdown();}
}

3. Future 接口

Future 用于表示异步任务的结果,可以用于检查任务状态、取消任务以及获取结果。

import java.util.concurrent.*;public class FutureExample {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executor = Executors.newSingleThreadExecutor();Future<Integer> future = executor.submit(() -> {Thread.sleep(1000);return 100;});if (!future.isDone()) {System.out.println("任务尚未完成...");}System.out.println("任务结果: " + future.get());executor.shutdown();}
}

4. Executor 接口和线程池

Executor 是任务执行的顶层接口,ExecutorService 提供了线程池的管理功能。线程池减少了线程创建和销毁的开销,并有效管理线程资源。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ExecutorExample {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(2);Runnable task1 = () -> System.out.println("任务1正在执行");Runnable task2 = () -> System.out.println("任务2正在执行");executor.execute(task1);executor.execute(task2);executor.shutdown(); // 关闭线程池}
}

5. ExecutorServiceshutdown() 方法

ExecutorService 提供了 shutdown() 方法用于优雅地关闭线程池。在调用 shutdown() 后,线程池不再接受新任务,但会完成已提交的任务。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class ShutdownExample {public static void main(String[] args) throws InterruptedException {ExecutorService executor = Executors.newFixedThreadPool(2);executor.submit(() -> System.out.println("任务1正在执行"));executor.submit(() -> System.out.println("任务2正在执行"));executor.shutdown(); // 不接受新任务,但会完成已有任务if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {executor.shutdownNow(); // 超时后强制关闭}}
}

6. ScheduledExecutorService

ScheduledExecutorService 提供了任务调度功能,可以延迟执行任务或周期性执行任务。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class ScheduledExecutorExample {public static void main(String[] args) {ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);// 延迟2秒执行scheduler.schedule(() -> System.out.println("延迟任务"), 2, TimeUnit.SECONDS);// 每隔3秒执行一次scheduler.scheduleAtFixedRate(() -> System.out.println("周期性任务"), 1, 3, TimeUnit.SECONDS);// 关闭调度器scheduler.schedule(() -> scheduler.shutdown(), 10, TimeUnit.SECONDS);}
}

7. ForkJoinPoolForkJoinTask

ForkJoinPool 是并行执行分治任务的执行器,适用于大规模递归计算。

import java.util.concurrent.RecursiveTask;
import java.util.concurrent.ForkJoinPool;public class ForkJoinExample extends RecursiveTask<Integer> {private final int start, end;public ForkJoinExample(int start, int end) {this.start = start;this.end = end;}@Overrideprotected Integer compute() {if (end - start <= 5) { // 小任务直接求和int sum = 0;for (int i = start; i <= end; i++) sum += i;return sum;} else { // 大任务分解int mid = (start + end) / 2;ForkJoinExample leftTask = new ForkJoinExample(start, mid);ForkJoinExample rightTask = new ForkJoinExample(mid + 1, end);leftTask.fork();return rightTask.compute() + leftTask.join();}}public static void main(String[] args) {ForkJoinPool pool = new ForkJoinPool();int result = pool.invoke(new ForkJoinExample(1, 10));System.out.println("计算结果: " + result);}
}

8. 异步编排和 CompletableFuture

CompletableFuture 支持更灵活的异步任务组合和编排。

import java.util.concurrent.CompletableFuture;public class CompletableFutureExample {public static void main(String[] args) {CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> "Hello").thenApply(result -> result + " World").thenAccept(System.out::println); // 打印 "Hello World"future.join(); // 等待任务完成}
}

总结

  • Runnable:无返回值的简单线程任务。
  • Callable:有返回值的任务。
  • Future:异步任务的结果,可以检查任务状态。
  • ExecutorServiceshutdown():管理线程池,提供优雅关闭。
  • ScheduledExecutorService:支持任务调度。
  • ForkJoinPool:分治并行计算。
  • CompletableFuture:异步编排,用于组合和处理多个异步任务。

通过这套多线程工具类和接口的结合,Java 能有效地进行并发编程,以适应复杂的多线程需求。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

echarts引入自定义字体不起作用问题记录

echarts引入自定义字体不起作用问题记录 1、问题描述 初始化界面字体不作用&#xff0c;当界面更新后字体样式正常显示 2、原因描述 这通常是由于字体文件加载延迟导致的。ECharts 在初始化时可能还没有加载完字体文件&#xff0c;因此无法正确应用字体样式 3、解决方案 …

UE5.4 PCG 生成藤蔓墙体

一、新建Actor&#xff0c;添加Spline组件&#xff0c;挂上PCG组件&#xff0c;设置“墙体”和“植被”为静态网格体变量 二、编写PCG_Wall 1.生成墙体 2.生成墙体植被

【网络】子网掩码

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是子网掩码&#xff0c;并且能熟练掌握子网掩码的相关计算。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会…

Worldly平台更新Higg FEM 2024模块价格及购买指南

近日&#xff0c;LEVERAGE供应链管理从美国可持续服装联盟&#xff08;Cascale&#xff09;验证官方Worldly平台模块订阅更新中获悉&#xff0c;FEM2024模块价格更新的重要信息。此次更新涉及工厂环境模块&#xff08;FEM&#xff09;和工厂社会劳工模块&#xff08;FSLM&#…

Rocky9通过Docker-compose部署zabbix 7.0.5

Rocky9通过Docker-compose部署zabbix 7.0.5 1. 实验环境架构2. Zabbix-Server准备工作2.1 更新仓库2.2 安装docker-ce2.3 安装docker-compose 3. 安装Zabbix项目3.1 克隆项目3.2 预下载镜像3.3 启动Zabbix 4. 启动web管理端4.1 登录web管理页4.2 修改时区和语言 5. Agent安装配…

企业内训系统

在当今这个竞争激烈的市场环境中&#xff0c;企业的持续发展不仅依赖于外部市场的拓展&#xff0c;更离不开内部团队能力的提升。企业内训系统&#xff0c;作为提升企业竞争力、促进员工成长的重要工具&#xff0c;正逐渐成为现代企业管理中不可或缺的一环。本文将深入探讨企业…

QT自定义控件封装

QT自定义控件封装 1.概述 这篇文章介绍如何创建UI文件&#xff0c;通过自定义方式将两个控件联动起来&#xff0c;实现自定义功能。 2.创建UI文件 新建一个widget的普通项目&#xff0c;然后在项目名称上右键选择And New... 新建文件&#xff0c;然后选择QT 再选择Qt Desig…

物联网(RFID)全景:被装信息化监控应用与挑战

一、被装物联网信息化建设的动因 信息化改革在20世纪80年代中期启航&#xff0c;旨在提升被装保障的效率。随着时间的推移&#xff0c;硬件的广泛运用和软件的快速迭代&#xff0c;装备业务在规划、制造、分发以及战时支援等核心环节&#xff0c;已经与信息系统深度融合&#x…

屏幕解析工具——OmniParser

0 引言 OmniParser是微软开源的一种屏幕解析工具&#xff0c;提供了一种将用户界面截图解析为结构化元素的综合方法&#xff0c;通过此方法可以对UI界面进行可交互元素的提取和描述&#xff0c;然后将此结构化信息和任务指令&#xff0c;输入到大模型中&#xff0c;以增强大模…

衡石分析平台系统分析人员手册-嵌入样式定制化指南­

发布页面嵌入样式定制化指南​ 使用衡石智能分析平台制作好 Dashboard 和 Chart 以后&#xff0c;可以通过 iframe 的方式嵌入到已有系统中。为了达到风格统一&#xff0c;嵌入 iframe 的时候支持丰富的定制化选项。 定制 Dashboard 的 iframe​ 参数列表​ 仪表盘嵌入时支持…

Nginx更换ssl证书不生效

一.场景 在用的ssl证书要过期了&#xff0c;申请了新的ssl证书下来&#xff0c;在nginx配置上更换上去后&#xff0c;打开系统地址&#xff0c;一依然是使用原来的旧证书&#xff0c;以前有更换过别的域名证书&#xff0c;重启nginx服务后立马就生效了。 这次没生效&#xff…

基于python和Django的用户管理接口开发

1.异步用户登录\登出接口开发 1.设计公共响应数据类型 文件地址&#xff1a;utils/response404.py from django.http import JsonResponseclass BadRequestJsonResponse(JsonResponse):status_code 400def __init__(self, err_list, *args, **kwargs):data {"error_c…

Docker--Docker是什么和对Docker的了解

Docker 的本质 Docker的本质是LXC&#xff08;Linux容器&#xff09;之类的增强版&#xff0c;它本身不是容器&#xff0c;而是容器的易用工具。 Docker通过虚拟化技术&#xff0c;将代码、依赖项和运行环境打包成一个容器&#xff0c;并利用隔离机制来使得容器之间互相独立、…

Window下PHP安装最新sg11(php5.3-php8.3)

链接: https://pan.baidu.com/s/10yyqTJdwH_oQJnQtWcwIeA 提取码: qz8y 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 (链接失效联系L88467872) 1.下载后解压文件&#xff0c;将对应版本的ixed.xx.win文件放进php对应的ext目录下&#xff0c;如图所示 2.修改ph…

C# yolo10使用onnx推理

一、前言 本篇总结C#端使用yolo10的onnx文件做模型推理&#xff0c;主要使用Microsoft.ML.OnnxRuntime.Gpu这个库。需要注意的是Microsoft.ML.OnnxRuntime 和 Microsoft.ML.OnnxRuntime.Gpu 这2库只装1个就行&#xff0c;CPU就装前者&#xff0c;反之后者。然后需要注意系统安装…

MNIST数据集下载与保存为图片格式

深度学习 文章目录 深度学习下载数据集 下载数据集 https://github.com/geektutu/tensorflow-tutorial-samples/tree/master/mnist/data_set t10k-images-idx3-ubyte.gz t10k-labels-idx1-ubyte.gz train-images-idx3-ubyte.gz train-labels-idx1-ubyte.gz 解压后&#xff0c;…

Oracle In子句

Oracle IN 运算符可以用来确定值是否与列表或子查询中的任何值相匹配 Oracle IN语法&#xff1a; 确定表达式是否与值列表匹配的 Oracle IN 运算符的语法如下所示&#xff1a; expression [NOT] IN (v1,v2,...)并且表达式的语法与子查询匹配&#xff1a; expression [NOT] I…

华为OD机试 - 查找舆情热词(Python/JS/C/C++ 2024 C卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

从容应对蓝屏:必知原因与对策

电脑蓝屏&#xff0c;即“蓝屏死机”或“蓝屏错误”&#xff0c;是计算机用户在日常使用中可能遇到的一种较为严重的系统错误状态。当屏幕突然变成蓝色&#xff0c;并显示错误代码和信息时&#xff0c;这通常意味着系统遇到了无法处理的问题&#xff0c;了解电脑蓝屏的原因及解…

每日小练:Day1

1.牛牛冲钻五 题目链接&#xff1a;A-牛牛冲钻五_牛客小白月赛38 题目描述&#xff1a; 代码如下&#xff1a; import java.util.*;public class Main{public static void main(String[] args){Scanner scannernew Scanner(System.in);int tscanner.nextInt();while(t--!0){…