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

Java高频面试之并发编程-05

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶

面试官:线程有哪些调度方法?

在Java中,线程的调用方法主要包括以下几种方式,每种方式适用于不同的场景和需求:


1. 继承 Thread

通过继承 Thread 类并重写 run() 方法,直接调用线程的 start() 方法启动线程。

实现步骤
class MyThread extends Thread {@Overridepublic void run() {System.out.println("Thread running by extending Thread");}
}// 调用方式
public class Main {public static void main(String[] args) {MyThread thread = new MyThread();thread.start(); // 启动线程,执行run()}
}
特点
  • 优点:简单直接。
  • 缺点:Java是单继承,继承 Thread 后无法继承其他类。
  • 适用场景:简单任务,无需共享资源。

2. 实现 Runnable 接口

实现 Runnable 接口,将任务逻辑写入 run() 方法,然后将实例传递给 Thread 对象。

实现步骤
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Thread running by implementing Runnable");}
}// 调用方式
public class Main {public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start();}
}
特点
  • 优点:避免单继承限制,任务与线程解耦,适合资源共享(如多个线程执行同一任务)。
  • 适用场景:多线程共享同一任务逻辑。

3. 实现 Callable 接口 + Future

通过 Callable 定义带返回值的任务,结合 ExecutorService 提交任务,并通过 Future 获取结果。

实现步骤
import java.util.concurrent.*;class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {return "Result from Callable";}
}public class Main {public static void main(String[] args) throws Exception {ExecutorService executor = Executors.newSingleThreadExecutor();Future<String> future = executor.submit(new MyCallable());System.out.println(future.get()); // 阻塞获取结果executor.shutdown();}
}
特点
  • 优点:支持返回值,可抛出异常。
  • 适用场景:需要异步结果的任务(如计算密集型操作)。

4. 线程池(Executor 框架)

通过线程池管理线程生命周期,避免频繁创建/销毁线程的开销。

实现步骤
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Main {public static void main(String[] args) {// 创建固定大小的线程池ExecutorService executor = Executors.newFixedThreadPool(3);// 提交Runnable任务executor.execute(() -> {System.out.println("Task executed by thread pool");});executor.shutdown(); // 关闭线程池}
}
线程池类型
  • newFixedThreadPool:固定线程数,适用于负载稳定的场景。
  • newCachedThreadPool:线程数自动扩展,适合短时异步任务。
  • newScheduledThreadPool:支持定时或周期性任务。
  • newSingleThreadExecutor:单线程顺序执行任务。
特点
  • 优点:资源复用、控制并发数、提供任务队列。
  • 适用场景:高并发、资源受限的系统。

5. 匿名内部类/Lambda表达式

简化线程创建的语法,适用于快速实现简单任务。

实现方式
public class Main {public static void main(String[] args) {// 匿名内部类(Runnable)new Thread(new Runnable() {@Overridepublic void run() {System.out.println("Anonymous Runnable");}}).start();// Lambda表达式(Java 8+)new Thread(() -> System.out.println("Lambda Runnable")).start();}
}
特点
  • 优点:代码简洁。
  • 适用场景:快速测试或简单任务。

6. 定时任务(ScheduledExecutorService

用于执行定时或周期性任务。

实现步骤
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class Main {public static void main(String[] args) {ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);// 延迟1秒后执行scheduler.schedule(() -> System.out.println("Delayed task"), 1, TimeUnit.SECONDS);// 周期性任务(首次延迟2秒,之后每3秒执行一次)scheduler.scheduleAtFixedRate(() -> System.out.println("Periodic task"), 2, 3, TimeUnit.SECONDS);}
}

7. 异步编程(CompletableFuture,Java 8+)

通过链式调用处理异步任务,支持回调和非阻塞操作。

实现步骤
import java.util.concurrent.CompletableFuture;public class Main {public static void main(String[] args) {CompletableFuture.supplyAsync(() -> "Async Result").thenAccept(result -> System.out.println(result)).join(); // 等待异步任务完成}
}
特点
  • 优点:支持链式调用、异常处理、任务组合。
  • 适用场景:复杂的异步编程需求(如多个异步任务依赖)。

总结与选型建议

方法核心优势典型场景
继承 Thread简单直接快速测试或简单任务
实现 Runnable解耦任务与线程,支持资源共享多线程共享任务逻辑
实现 Callable支持返回值和异常需要异步结果的计算任务
线程池资源复用,高效管理线程高并发、资源受限的系统
CompletableFuture异步编程,链式调用复杂异步任务编排

根据具体需求选择合适的方法:

  • 简单任务:直接使用 Runnable + Thread 或 Lambda。
  • 结果依赖:使用 Callable + FutureCompletableFuture
  • 高并发场景:优先使用线程池(如 newFixedThreadPool)。
  • 定时任务:选择 ScheduledExecutorService

在这里插入图片描述

相关文章:

Java高频面试之并发编程-05

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;线程有哪些调度方法&#xff1f; 在Java中&#xff0c;线程的调用方法主要包括以下几种方式&#xff0c;每种方式适用于…...

野外价值观:在真实世界的语言模型互动中发现并分析价值观

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

【Linux】47.高级IO(1)

文章目录 1. 高级IO1.1 五种IO模型1.2 高级IO重要概念1.2.1 同步通信 vs 异步通信1.2.2 阻塞 vs 非阻塞 1.3非阻塞IO1.3.1 fcntl1.3.2 实现函数SetNoBlock1.3.3 轮询方式读取标准输入1.3.4 I/O多路转接之select1.3.4.1 初识select&#xff1a;1.3.4.2 select函数原型1.3.4.3 理…...

notepad++技巧:查找和替换:扩展 or 正则表达式

notepad 有很多优点&#xff1a;多标签&#xff0c;代码高亮&#xff0c;我最喜欢的是查找和替换。 除了可以一次性查找所有打开文件&#xff0c;还可以使用 扩展 or 正则表达式。 例如&#xff1a; 去掉空行&#xff1a;正则表达式&#xff1a; ^\s*$\r\n ^ 表示行首。\s*…...

【图像标注技巧】目标检测图像标注技巧

介绍一些图像标注技巧。之前引用过别人的文章 yolo目标检测 技巧 trick 提升模型性能&#xff0c;deep research检测调研报告也可以进行参考。 拉框类的标注&#xff0c;如果你不确定哪种方法好&#xff0c;你可以把所标注区域的都剪切出来&#xff0c;然后站在屏幕一米之外眯…...

MuJoCo中的机器人状态获取

UR5e机器人xml文件模型 <mujoco model"ur5e"><compiler angle"radian" meshdir"assets" autolimits"true"/><option integrator"implicitfast"/><default><default class"ur5e">&…...

pnpm解决幽灵依赖问题

文章目录 前言1. npm/yarn 现在还有幽灵依赖问题吗&#xff1f;2. pnpm 解决了幽灵依赖问题吗&#xff1f;3. pnpm 是如何解决的&#xff1f;举例说明 1. pnpm 的 node_modules 结构原理结构示意 2. 实际演示幽灵依赖的杜绝步骤1&#xff1a;初始化项目并安装依赖步骤2&#xf…...

测试第四课---------性能测试工具

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…...

frp远程穿透配置

文章目录 准备工作服务端配置(toml)客户端配置(toml)访问内网服务使用ini文件配置 frp是一个高性能的反向代理应用&#xff0c;用于将位于内网的服务通过代理暴露到公网。以下是其基本使用步骤&#xff1a; 准备工作 拥有一台具有公网IP的服务器&#xff0c;作为frp的服务端。…...

【C++】新手入门指南(下)

文章目录 前言 一、引用 1.引用的概念和定义 2.引用的特性 3.引用的使用 4.const引用 5.指针和引用的关系 二、内联函数 三、nullptr 总结 前言 这篇续上篇的内容新手入门指南&#xff08;上&#xff09;&#xff0c;继续带大家学习新知识。如果你感兴趣欢迎订购本专栏。 一、…...

Linux系统编程 day9 SIGCHLD and 线程

SIGCHLD信号 只要子进程信号发生改变&#xff0c;就会产生SIGCHLD信号。 借助SIGCHLD信号回收子进程 回收子进程只跟父进程有关。如果不使用循环回收多个子进程&#xff0c;会产生多个僵尸进程&#xff0c;原因是因为这个信号不会循环等待。 #include<stdio.h> #incl…...

前后端分离项目在未部署条件下如何跨设备通信

其实我此前也不知道这个问题怎么解决&#xff0c;也没有想过—因为做的项目大部分都是前后端分离的&#xff0c;前端直接用后端的部署好的环境就行了。最近也是有点心高气傲开始独立开发&#xff0c;一个人又写前端又写后端也是蛮累的&#xff0c;即使有强有力的cursor也很累很…...

基于Python的多光谱遥感数据处理与分类技术实践—以农作物分类与NDVI评估为例

多光谱遥感数据包含可见光至红外波段的光谱信息&#xff0c;Python凭借其丰富的科学计算库&#xff08;如rasterio、scikit-learn、GDAL&#xff09;&#xff0c;已成为处理此类数据的核心工具。本文以Landsat-8数据为例&#xff0c;演示‌辐射校正→特征提取→监督分类→精度评…...

vscode python 代码无法函数跳转的问题

TL; DR; python.languageServer 配置成了 None 导致 vscode python 代码无法函数跳转 详细信息 mac 环境下 vscode 正常 command 鼠标左键 可以跳转到定义或者使用位置&#xff0c;但是我的为何不知道失效了 我一开始以为是热键冲突&#xff0c;结果发现 mac 好像没办法定…...

SAS宏核心知识与实战应用

1. SAS宏基础 1.1 核心概念 1.1.1 宏处理器 宏处理器在SAS程序运行前执行,用于生成动态代码,可实现代码的灵活定制。 通过宏处理器,可基于输入参数动态生成不同的SAS代码,提高代码复用性。 1.1.2 宏变量 宏变量是存储文本值的容器,用&符号引用,如&var,用于存储…...

Unity 脚本使用(二)——UnityEngine.AI——NavMesh

描述 Singleton class 用于访问被烘培好的 NavMesh. 使用NavMesh类可以执行空间查询&#xff08;spatial queries&#xff09;&#xff0c;例如路径查找和可步行性测试。此类还允许您设置特定区域类型的寻路成本&#xff0c;并调整寻路和避免的全局行为。 静态属性&#xff0…...

从项目真实场景中理解二分算法的细节(附图解和模板)

遇到一个真实场景里使用二分算法的问题&#xff0c;本以为可以放心交给小师弟去做&#xff0c;结果出现了各种问题&#xff0c;在此梳理下二分算法的核心思想和使用细节。 文章目录 1.场景描述2.场景分析3.二分算法的精髓3.1 核心模板3.2 二分过程图解3.3 各种区间写法3.3.1 闭…...

金融图QCPFinancial

QCPFinancial 是 QCustomPlot 中用于绘制金融图表&#xff08;如蜡烛图/K线图&#xff09;的核心类。以下是其关键特性的详细说明&#xff1a; 一、主要属性 属性类型说明dataQSharedPointer<QCPFinancialDataContainer>存储金融数据的数据容器chartStyleQCPFinancial:…...

Jetson Orin NX 16G 配置GO1强化学习运行环境

这一次收到了Jrtson Orin NX, 可以进行部署了。上一次在nano上的失败经验 Jetson nano配置Docker和torch运行环境_jetson docker-CSDN博客 本次的目的是配置cuda-torch-python38环境离机运行策略。 Jetson Orin NX SUPER 1. 烧录镜像 参考链接在ubuntu系统中安装sdk manag…...

文档管理 Document Management

以下是关于项目管理中 文档管理 的深度解析,结合高项(如软考高级信息系统项目管理师)教材内容,系统阐述文档管理的理论框架、核心流程及实战应用: 一、文档管理的基本概念 1. 定义 文档管理是对项目全生命周期中产生的各类文档进行规范化管理的过程,包括创建、存储、版…...

【Pandas】pandas DataFrame truediv

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象&#xff08;如 DataFrame、Series 或标量&#xff09;的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...

Linux 内核中 cgroup 子系统 cpuset 是什么?

cpuset 是 Linux 内核中 cgroup&#xff08;控制组&#xff09; 的一个子系统&#xff0c;用于将一组进程&#xff08;或任务&#xff09;绑定到特定的 CPU 核心和 内存节点&#xff08;NUMA 节点&#xff09;上运行。它通过限制进程的 CPU 和内存资源的使用范围&#xff0c;优…...

Windows 同步-互锁变量访问

互锁变量访问 应用程序必须同步对多个线程共享的变量的访问。 应用程序还必须确保对这些变量的作以原子方式执行&#xff08;完全或根本不执行&#xff09;。 对正确对齐的 32 位变量的简单读取和写入是原子作。 换句话说&#xff0c;你最终不会只更新变量的一部分;所有位都以…...

深度学习3.5 图像分类数据集

%matplotlib inline import torch import torchvision from torch.utils import data from torchvision import transforms from d2l import torch as d2l代码执行流程图 #mermaid-svg-WWhBmQvijswiICpI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-…...

js原型链prototype解释

function Person(){} var personnew Person() console.log(啊啊,Person instanceof Function);//true console.log(,Person.__proto__Function.prototype);//true console.log(,Person.prototype.__proto__ Object.prototype);//true console.log(,Function.prototype.__prot…...

从M个元素中查找最小的N个元素时,使用大顶堆的效率比使用小顶堆更高,为什么?

我们有一个长度为 M 的数组&#xff0c;现在我们想从中找出 最小的 N 个元素。例如&#xff1a; int a[10] {12, 3, 5, 7, 19, 0, 8, 2, 4, 10};从中找出 最小的 4 个元素。 正确方法&#xff1a;使用大小为 N 的「大顶堆」 原因分析&#xff1a; 我们想保留最小的 4 个元素…...

【知识】性能优化和内存优化的主要方向

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 前言 现在有很多论文&#xff0c;乍一看很高级&#xff0c;实际上一搜全是现有技术的堆砌&#xff0c;但是这种裁缝式的论文依然能发表在很好的会议和期…...

VS Code + GitHub:高效开发工作流指南

目录 一、安装 & 基本配置 1.下载 VS Code 2.安装推荐插件(打开侧边栏 Extensions) 3.设置中文界面(可选) 二、使用 VS Code 操作 Git/GitHub 1.基本 Git 操作(不输命令行!) 2.连接 GitHub(第一次使用) 三、克隆远程仓库到 VS Code 方法一(推荐): 方…...

软件测试之接口测试常见面试

一、什么是(软件)接口测试? 接口测试&#xff1a;是测试系统组件间接口的一种测试方法 接口测试的重点&#xff1a;检查数据的交换&#xff0c;数据传递的正确性&#xff0c;以及接口间的逻辑依赖关系 接口测试的意义&#xff1a;在较早期开展&#xff0c;在软件开发的同时…...

发送百度地图的定位

在vuephp写的聊天软件项目中&#xff0c;增加一个发送百度地图的定位功能 在 Vue PHP 的聊天软件中增加发送百度地图定位功能&#xff0c;需要从前端定位获取、地图API集成、后端存储到消息展示全流程实现。以下是详细步骤&#xff1a; 一、前端实现&#xff08;Vue/Uni-app…...