java2025年多线程热点面试题第一弹

1. Java中创建线程的几种方式有哪些?

答案

  1. 继承Thread
    class MyThread extends Thread {@Overridepublic void run() {System.out.println("Thread is running.");}
    }
    new MyThread().start();
    
  2. 实现Runnable接口
    class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Thread is running.");}
    }
    new Thread(new MyRunnable()).start();
    
  3. 实现Callable接口(支持返回值和异常):
    class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {return "Thread is running.";}
    }
    FutureTask<String> futureTask = new FutureTask<>(new MyCallable());
    new Thread(futureTask).start();
    System.out.println(futureTask.get());
    
  4. 使用线程池
    ExecutorService executor = Executors.newSingleThreadExecutor();
    executor.submit(() -> System.out.println("Thread is running."));
    executor.shutdown();
    

2. Java中的wait()sleep()的区别是什么?

答案

  • wait()

    • Object类的方法,必须在同步方法或同步代码块中使用。
    • 释放当前线程持有的锁,进入等待状态,直到被其他线程唤醒。
    • 可以指定等待时间,超时后线程会自动唤醒。
    • 示例:
      synchronized (obj) {obj.wait();
      }
      
  • sleep()

    • Thread类的静态方法,不会释放锁。
    • 线程暂停指定时间后自动恢复运行。
    • 示例:
      Thread.sleep(1000);
      

3. 如何实现线程间的通信?

答案
线程间通信可以通过以下方式实现:

  1. 使用wait()notify()/notifyAll()

    • wait():线程释放锁并进入等待状态。
    • notify()/notifyAll():唤醒等待中的线程。
    • 示例:
      class SharedResource {private boolean available = false;public synchronized void produce() throws InterruptedException {while (available) {wait();}System.out.println("Produced");available = true;notifyAll();}public synchronized void consume() throws InterruptedException {while (!available) {wait();}System.out.println("Consumed");available = false;notifyAll();}
      }
      
  2. 使用java.util.concurrent包中的工具类

    • BlockingQueue:线程安全的队列,支持阻塞操作。
    • 示例:
      BlockingQueue<String> queue = new LinkedBlockingQueue<>(1);
      queue.put("Item");
      String item = queue.take();
      

4. Java中的线程池有哪些类型?

答案
Java提供了多种线程池类型,每种类型适用于不同的场景:

  1. Executors.newFixedThreadPool(int n)

    • 创建一个固定大小的线程池,线程数为n
    • 适用于任务数量较多且线程数固定的场景。
  2. Executors.newSingleThreadExecutor()

    • 创建一个单线程的线程池,所有任务按顺序执行。
    • 适用于任务需要按顺序执行的场景。
  3. Executors.newCachedThreadPool()

    • 创建一个可缓存的线程池,线程数根据任务数量动态调整。
    • 适用于任务数量不确定且线程数需要动态调整的场景。
  4. Executors.newScheduledThreadPool(int corePoolSize)

    • 创建一个支持定时任务的线程池。
    • 示例:
      ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
      executor.scheduleAtFixedRate(() -> System.out.println("Task executed"), 0, 1, TimeUnit.SECONDS);
      

5. 如何避免线程安全问题?

答案
避免线程安全问题可以通过以下方式:

  1. 使用同步机制

    • synchronized方法或代码块。
    • 示例:
      public synchronized void increment() {count++;
      }
      
  2. 使用java.util.concurrent包中的工具类

    • ConcurrentHashMap:线程安全的哈希表。
    • AtomicInteger:线程安全的整数。
    • 示例:
      AtomicInteger count = new AtomicInteger(0);
      count.incrementAndGet();
      
  3. 使用不可变对象

    • 不可变对象(如StringInteger)是线程安全的,因为它们的状态不可变。
  4. 使用锁(ReentrantLock

    • 示例:
      Lock lock = new ReentrantLock();
      lock.lock();
      try {// Critical section
      } finally {lock.unlock();
      }
      

6. Java中的volatile关键字的作用是什么?

答案

  • volatile用于修饰变量,确保变量的读写操作对所有线程可见。
  • 它可以防止指令重排序,但不能保证复合操作的原子性。
  • 示例:
    private volatile boolean running = true;public void run() {while (running) {// Do something}
    }
    

7. 如何实现线程的中断?

答案
线程可以通过以下方式中断:

  1. 调用Thread.interrupt()方法

    • 设置线程的中断状态。
    • 示例:
      Thread thread = new Thread(() -> {while (!Thread.currentThread().isInterrupted()) {// Do something}
      });
      thread.start();
      thread.interrupt();
      
  2. run()方法中检查中断状态

    • 使用Thread.currentThread().isInterrupted()检查线程是否被中断。
    • 示例:
      public void run() {while (!Thread.currentThread().isInterrupted()) {// Do something}
      }
      

8. Java中的FutureCompletableFuture的区别是什么?

答案

  • Future

    • 用于异步任务的结果。
    • 提供get()方法获取任务结果,但不支持回调。
    • 示例:
      Future<String> future = executor.submit(() -> "Result");
      String result = future.get();
      
  • CompletableFuture

    • Future的增强版本,支持链式调用和回调。
    • 提供thenApplythenAcceptthenCombine等方法。
    • 示例:
      CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Result");
      future.thenAccept(System.out::println);
      

9. 如何实现线程的同步?

答案
线程同步可以通过以下方式实现:

  1. 使用synchronized关键字

    • 示例:
      public synchronized void increment() {count++;
      }
      
  2. 使用锁(ReentrantLock

    • 示例:
      Lock lock = new ReentrantLock();
      lock.lock();
      try {// Critical section
      } finally {lock.unlock();
      }
      
  3. 使用java.util.concurrent包中的同步工具类

    • Semaphore:信号量,用于控制同时访问某个资源的线程数量。
    • 示例:
      Semaphore semaphore = new Semaphore(2);
      semaphore.acquire();
      semaphore.release();
      

10. Java中的线程池如何管理线程的生命周期?

答案
线程池通过以下方式管理线程的生命周期:

  1. 线程的创建

    • 线程池在初始化时创建一定数量的线程。
    • 当任务提交时,线程池会根据当前线程数和任务队列的状态决定是否创建新线程。
  2. 线程的执行

    • 线程从任务队列中获取任务并执行。
    • 如果任务队列为空,线程会等待新任务。
  3. 线程的销毁

    • 线程池会根据配置的keepAliveTimecorePoolSize决定是否销毁空闲线程。
    • 当线程池关闭时(调用shutdown()shutdownNow()

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

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

相关文章

使用ast获取py文件中所有函数与类名

当我们在创建python项目,经常需要遍历和分析代码文件&#xff0c;特别是当我们想要自动化地获取某些信息&#xff0c;比如所有的函数和类名。Python的ast&#xff08;Abstract Syntax Trees&#xff0c;抽象语法树&#xff09;模块为我们提供了一个强大的工具&#xff0c;可以方…

【C语言5】函数:库函数、自定义函数、形参和实参、return语句、数组做函数参数、嵌套调用和链式访问、声明和定义

文章目录 一、函数的概念二、库函数2.1 标准库和头文件2.2 库函数的使用方法 三、自定义函数3.1 函数的语法形式 四、形参和实参4.1 实参4.2 形参4.2 实参和形参的关系 五、return 语句六、数组做函数参数七、嵌套调用和链式访问7.1 嵌套调用7.2 链式访问 八、函数的声明和定义…

【项目管理】基于 C 语言的 QQ 聊天室实现(TCP + 多线程 + SQLite3)

基于 C 语言的 QQ 聊天室(TCP + 多线程 + SQLite3) 项目功能基础功能: 登录、注册、添加好友、私聊、创建群聊、群聊扩展功能: 删除好友、注销账号、好友在线状态、群管理(拉人/踢人)、VIP 特权、邮件通知等 功能介绍:模拟QQ聊天客户端:登录界面:1、登录2、注册 //将用…

vscode 都有哪些大模型编程插件

VSCode 中有许多基于大模型的编程插件&#xff0c;这些插件通过集成人工智能技术&#xff0c;显著提升了开发者的编程效率和体验。以下是一些主要的大模型编程插件及其功能&#xff1a; GitHub Copilot GitHub Copilot 是由 OpenAI 开发的插件&#xff0c;能够根据代码上下文自…

每日一题洛谷普及/提高-P1154 奶牛分厩c++

无注释版 #include<iostream> #include<cstring> #include<cstdlib> using namespace std; bool ju(int n, int s[], int len, bool a[]) {memset(a, 0, n * sizeof(bool));for (int j 0; j < len; j) {if (a[s[j] % n]) {return false;}a[s[j] % n] t…

[liorf_localization_imuPreintegration-2] process has died

使用liorf&#xff0c;编译没报错&#xff0c;但是roslaunch报错如下&#xff1a; 解决方法&#xff1a; step1: 如果你之前没有安装 GTSAM&#xff0c;可以尝试安装它 step2: 检查是否缺少依赖库 ldd /home/zz/1210/devel/lib/liorf_localization/liorf_localization_imuPr…

Jmeter+ant+jenkins接口自动化测试

平台简介 一个完整的接口自动化测试平台需要支持接口的自动执行&#xff0c;自动生成测试报告&#xff0c;以及持续集成。Jmeter 支持接口的测试&#xff0c;Ant 支持自动构建&#xff0c;而 Jenkins 支持持续集成&#xff0c;所以三者组合在一起可以构成一个功能完善的接口自动…

springboot425-基于SpringBoot的BUG管理系统(源码+数据库+纯前后端分离+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…

如何将飞书多维表格与DeepSeek R1结合使用:效率提升的完美搭档

将飞书的多维表格与DeepSeek R1结合使用&#xff0c;就像为你的数据管理和分析之旅装上一台涡轮增压器。两者的合作&#xff0c;不仅仅在速度上让人耳目一新&#xff0c;更是将智能化分析带入了日常的工作场景。以下是它们如何相辅相成并改变我们工作方式的一些分享。 --- 在…

leetcode 148. 排序链表

题目如下 数据范围 通过代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : va…

关于对机器中的人工智能进行基准测试

大家读完觉得有帮助记得及时关注和点赞&#xff01;&#xff01;&#xff01; 抽象 最近的基准研究声称&#xff0c;AI 在各种认知任务上的表现已经接近甚至超过人类的“水平”。然而&#xff0c;本立场文件认为&#xff0c;当前的 AI 评估范式不足以评估类似人类的认知能力。我…

C# OnnxRuntime部署DAMO-YOLO交通标识检测

目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Floa…

【开源-鸿蒙土拨鼠大理石系统】鸿蒙 HarmonyOS Next App+微信小程序+云平台

✨本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✨踩坑不易&#xff0c;还希望各位大佬支持一下&#xff0c;在GitHub给我点个 Start ⭐⭐&#x1f44d;&#x1f44d; ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/HarmonyOS-groundhog-mar…

QT实现单个控制点在曲线上的贝塞尔曲线

最终效果: 一共三个文件 main.cpp #include <QApplication> #include "SplineBoard.h" int main(int argc,char** argv) {QApplication a(argc, argv);SplineBoard b;b.setWindowTitle("标准的贝塞尔曲线");b.show();SplineBoard b2(0.0001);b2.sh…

深入探索Python机器学习算法:监督学习(线性回归,逻辑回归,决策树与随机森林,支持向量机,K近邻算法)

文章目录 深入探索Python机器学习算法&#xff1a;监督学习一、线性回归二、逻辑回归三、决策树与随机森林四、支持向量机五、K近邻算法 深入探索Python机器学习算法&#xff1a;监督学习 在机器学习领域&#xff0c;Python凭借其丰富的库和简洁的语法成为了众多数据科学家和机…

二、QT和驱动模块实现智能家居-----问题汇总1

1、文件地址改变后必须在QT下更改地址 2、指定了QT内Kits下的Sysroot头文件地址&#xff0c;但是还是找不到头文件&#xff1a; 3、提示无法执行QT程序&#xff1a;先干掉之前的QT程序 ps //查看程序PIDkill -9 PID 4、无法执行QT程序 1&#xff09;未设置环境变量 …

【Linux专栏_1】Linux中常用的指令

文章目录 前言1、查看Linux主机ip2、 Linux下的常用指令集合(1)、ls指令(2)、pwd指令(3)、cd指令(4)、touch指令(5)、mkdir指令(6)、rmdir和rm删除指令(7)、man指令(8)、cp指令(9)、mv指令(10)、cat指令(11)、more指令(12)、date指令(13)、cal指令(14)、find指令(15)、which指令…

Android+SpringBoot的老年人健康饮食小程序平台

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 我将从经济、生活节奏、技术融合等方面入手&#xff0c;详细阐述居家养老管理模式兴起的…

yoloV5的学习-pycharm版本

真的很让人气愤的一点&#xff0c;老师把我的pycharm给卸载了&#xff0c;我那个上面不仅有gpu-torch&#xff0c;还有gpu-torch&#xff0c;他给俺删了&#xff0c;删了很久&#xff0c;我心都碎了&#xff0c;过几天我就去找他负责&#xff0c;让他给我装回来我的环境&#x…

DeepSeek搭配Excel,制作自定义按钮,实现办公自动化!

今天跟大家分享下我们如何将DeepSeek生成的VBA代码&#xff0c;做成按钮&#xff0c;将其永久保存在我们的Excel表格中&#xff0c;下次遇到类似的问题&#xff0c;直接在Excel中点击按钮&#xff0c;就能10秒搞定&#xff0c;操作也非常的简单. 一、代码准备 代码可以直接询问…