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

在这里插入图片描述

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

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

相关文章

进程的同步和互斥

进程同步&#xff08;synchronous&#xff09; ✅通俗理解&#xff1a; 就像在排队买饭&#xff0c;一个一个来&#xff0c;前面的人不走&#xff0c;后面的人就不能干事。 进程同步就是&#xff1a;多个进程之间需要协调&#xff0c;有先后顺序&#xff0c;一个进程要等另一…

PDF处理控件Aspose.PDF指南:使用 Python 将 EPUB 转换为 PDF

EPUB是一种流行的电子书格式&#xff0c;用于可重排内容&#xff0c;而PDF则广泛用于固定版式文档&#xff0c;非常适合共享和打印。如果您想使用 Python 将 EPUB 转换为 PDF&#xff0c;Aspose.PDF for Python 提供了一个简单可靠的解决方案。在本教程中&#xff0c;我们将向您…

day4-小白学习JAVA---开发软件_Scanner键盘录入_Random随机数_流程控制语句

开发软件_Scanner键盘录入_Random随机数_流程控制语句 一、开发软件idea&#xff08;MAC版&#xff09;1、软件安装-安装社区版2、中英文设置3、保存时格式化配置4、注释和代码对不齐5、idea快捷键 二、键盘录入--Scanner1、next和nextInt2、next和nextLine区别 三、Random随机…

MySQL基本查询与数据操作全面解析

目录 1. CRUD操作概述 2. Create操作详解 2.1 表的创建 2.2 单行数据插入 2.3 多行数据插入 2.4 插入冲突处理 3. Retrieve操作详解 3.1 基础查询 全列查询&#xff08;慎用&#xff09; 指定列查询 表达式查询 结果去重 3.2 条件查询&#xff08;WHERE子句&#…

01.Python代码Pandas是什么?pandas的简介

01.Python代码Pandas是什么&#xff1f;pandas的简介 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是pandas的使用语法。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性&#xff0c;希望对您有用~ pyth…

(8)ECMAScript语法详解

本系列教程目录&#xff1a;Vue3Element Plus全套学习笔记-目录大纲 文章目录 第2章 ECMAScript2.1 ECMAScript 的发展历史2.2 什么是ES62.3 ES6语法新特性2.3.1 变量声明let2.3.2 常量声明2.3.3 模板字符串2.3.4 函数默认参数2.3.5 箭头函数2.3.6 对象初始化简写2.3.7 解构2.3…

Android JNI开发中头文件引入的常见问题与解决方案​,提示:file not found

Android JNI开发中头文件引入的常见问题与解决方案 问题场景&#xff08;新手易犯错误&#xff09; 假设你在开发一个JNI项目&#xff0c;想要实现一个线程安全的队列&#xff08;SafeQueue&#xff09;&#xff0c;于是直接在cpp目录下创建了safe_queue.h文件&#xff0c;并开…

C++静态与动态联编区别解析

在 C++ 中,静态联编(Static Binding)和动态联编(Dynamic Binding)是两种不同的函数调用绑定机制,核心区别在于确定函数调用的时机和多态性的支持。以下是详细解释: 1. 静态联编(Static Binding) 定义:在编译阶段确定函数调用与具体实现的关系。特点: 由编译器直接确…

如何批量为多个 Word 文档添加水印保护

在日常办公中&#xff0c;Word文档添加水印是一项重要的操作&#xff0c;特别是在需要保护文件内容的安全性和版权时。虽然Office自带了添加水印的功能&#xff0c;但当需要一次性给多个Word文档添加水印时&#xff0c;手动操作显得非常繁琐且低效。为了提高效率&#xff0c;可…

【愚公系列】《Python网络爬虫从入门到精通》057-分布式爬取中文日报新闻数据

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…

Linux系统编程 day9 SIGCHLD and 线程

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

微信小程序拖拽排序有效果图

效果图 .wxml <view class"container" style"--w:{{w}}px;" wx:if"{{location.length}}"><view class"container-item" wx:for"{{list}}" wx:key"index" data-index"{{index}}"style"--…

hadoop三大组件的结构及各自的作用

1 HDFS 1.1功能 HDFS 是 Hadoop 的分布式文件系统&#xff0c;用于存储和管理海量数据。它具有高容错性、高吞吐量和可扩展性&#xff0c;能够在多个节点上存储和管理大规模数据 1.2架构&#xff1a;采用主从架构&#xff0c;由一个 NameNode 和多个 DataNode 组成。NameNode…

解决jupyter notebook修改路径下没有c.NotebookApp.notebook_dir【建议收藏】

文章目录 一、检查并解决问题二、重新设置默认路径创作不易&#xff0c;感谢未来首富们的支持与关注&#xff01; 最近在用jupyter notebook编写代码时&#xff0c;更新了一下Scikit-learn的版本&#xff0c;然后重新打开jupyter notebook的时候&#xff0c;我傻眼了&#xff0…

MCP Host、MCP Client、MCP Server全流程实战

目录 准备工作 MCP Server 实现 调试工作 MCP Client 实现 MCP Host 配置 第一步:配置支持 function calling的 LLM 第二步:添加MCP Server 一般有两种方式,第一种json配置,第二种直接是Command形式,我这里采用Command形式 第三步:使用MCP Server 准备工作 安装…

4.21—4.22学习总结 JavaWeb:HTML-CSS

Web&#xff1a;能够通过浏览器访问到的网站。 Web标准&#xff1a; HTML&#xff1a; vscode中进行注释的快捷键为ctrl斜线/ h1的字体最大&#xff0c;依次递减&#xff0c;只存在h1—h6。 超链接&#xff1a; 设置字体颜色&#xff1a; 方式三写一个css文件&#xff0c;将方…

Kaamel Agent: 基于EU AI Act的AI影响评估(AIIA)

1. 引言&#xff1a;安全视角下的AI监管 随着人工智能技术的快速发展和广泛应用&#xff0c;AI系统在为社会带来创新和效率的同时&#xff0c;也引发了诸多关于安全、隐私和合规的担忧。在这一背景下&#xff0c;全球范围内涌现出多种监管框架和标准&#xff0c;旨在确保AI系统…

Mongodb分布式文件存储数据库

文章目录 一、MongoDB 简介基本信息特点内部组件 二、MongoDB 部署1. 安装依赖2. 解压部署并配置环境变量3. 修改配置文件以及启动服务4.数据库权限管理 三、MongoDB 管理1. 角色权限2. 操作命令用户管理命令常用命令&#xff08;Mongo4.2.8&#xff09;数据库相关用户相关集合…

麒麟V10安装MySQL8.4

1、下载安装包 wget https://cdn.mysql.com//Downloads/MySQL-8.4/mysql-8.4.5-1.el7.x86_64.rpm-bundle.tar2、解压 mkdir -p /opt/mysql tar -xvf mysql-8.4.5-1.el7.x86_64.rpm-bundle.tar -C /opt/mysql3、安装MySQL 3.1、卸载mariadb rpm -qa | grep mariadb rpm -e m…

Unreal如何使用后处理材质实现一个黑屏渐变效果

文章目录 前言相机后期处理材质创建材质相机设置动态修改FadeAlpha参数使用示例最后前言 UE5 开发VR ,如何通过PostProcess轻松实现黑屏渐变效果 最简单的办法,其实是使用一个半球形模型,遮挡住相机,然后控制这个半球形遮罩的颜色透明度,至少Unity中默认的Tunneling是这么…