2024年150道高频Java面试题(二十八)

55. 解释一下 Java 中的等待/通知机制。

Java中的等待/通知机制是线程间通信的一种方式,它通过Object类的三个方法来实现:wait(), wait(long timeout), 和 notify(), 以及 notifyAll()

  1. wait(): 当一个线程调用一个共享对象的 wait() 方法时,该线程会进入等待状态,并暂时释放它对共享对象的锁定。这允许其他线程访问该对象。
  2. wait(long timeout): 与 wait() 类似,但它允许设置一个超时时间,如果在指定时间内没有被通知,线程将自动醒来。
  3. notify(): 当一个线程调用共享对象的 notify() 方法时,它会唤醒在该对象上等待的一个线程(如果有多个线程在等待,具体唤醒哪一个是不确定的)。
  4. notifyAll(): 唤醒在该对象上等待的所有线程。

以下是使用等待/通知机制的一个简单示例:

public class WaitNotifyExample {public synchronized void method1() {try {System.out.println("Thread " + Thread.currentThread().getName() + " is waiting.");wait(); // 释放锁System.out.println("Thread " + Thread.currentThread().getName() + " is resumed.");} catch (InterruptedException e) {e.printStackTrace();}}public synchronized void method2() {System.out.println("Thread " + Thread.currentThread().getName() + " is going to notify.");notify(); // 唤醒在同一个对象上等待的线程}
}public class Main {public static void main(String[] args) {WaitNotifyExample example = new WaitNotifyExample();Thread t1 = new Thread(() -> example.method1(), "Thread-1");Thread t2 = new Thread(() -> example.method2(), "Thread-2");t1.start();t2.start();// 确保线程t1先执行try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }// 通知t1继续执行synchronized (example) {example.notify();}}
}

注意:

  • wait()notify() 方法必须包含在一个同步块或方法中,因为它们需要操作锁。
  • 当线程调用 wait() 时,它不会竞争锁,直到它被唤醒。
  • 使用 notify() 而不是 notifyAll() 可能会导致线程饥饿,因为某些线程可能永远不会被唤醒。

这种机制主要用于生产者-消费者模式,信号量模式等并发场景中,以实现线程之间的协调和通信。

56. Java 中的线程池是如何工作的?

Java 中的线程池是一种基于池化思想管理线程的机制,它主要解决了两个问题:一是减少创建和销毁线程所需的时间,二是提高系统响应速度。

线程池的工作原理如下:

  1. 创建线程池:线程池通过Executor框架来创建和管理,常见的创建方式有ThreadPoolExecutorExecutors工厂类。
  2. 提交任务:当一个任务需要执行时,它被提交给线程池。
  3. 任务队列:线程池内部维护一个队列(工作队列),用于存储待执行的任务。
    • 如果线程池中有空闲线程,线程池将选取一个线程执行任务。
    • 如果线程池中所有线程都在工作,新提交的任务将被放入队列中等待。
  4. 线程复用:线程池中的线程执行完任务后不会被销毁,而是回到线程池中等待下一个任务。
  5. 线程管理:线程池负责管理线程的生命周期,如创建、销毁、挂起等。

以下是线程池中几个重要的参数:

  • 核心线程数(Core Pool Size):线程池维护线程的最少数量。
  • 最大线程数(Maximum Pool Size):线程池维护线程的最大数量。
  • 工作队列(Work Queue):用于存储待执行任务的队列。
  • 存活时间(KeepAliveTime):非核心线程的空闲存活时间。
  • 线程工厂(ThreadFactory):用于创建新线程的工厂。
  • 拒绝策略(RejectedExecutionHandler):当任务无法执行时的处理策略。

下面是一个使用ThreadPoolExecutor创建线程池的示例:

import java.util.concurrent.*;public class ThreadPoolExample {public static void main(String[] args) {int corePoolSize = 2;int maxPoolSize = 4;long keepAliveTime = 10;TimeUnit unit = TimeUnit.SECONDS;BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(2);ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue);// 提交任务for (int i = 0; i < 6; i++) {final int index = i;executor.execute(() -> {System.out.println("执行任务: " + index);try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}});}// 关闭线程池executor.shutdown();}
}

总的来说,线程池通过提前创建线程并复用,减少线程创建和销毁的开销,从而提高系统性能和响应速度。同时,它还支持多种灵活的配置和扩展,使得线程管理更加高效和可靠。

有帮助请点赞收藏呀~

领【150 道精选 Java 高频面试题】请 go 公众号:码路向前 。

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

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

相关文章

Java实现二叉树(下)

1.前言 http://t.csdnimg.cn/lO4S7 在前文我们已经简单的讲解了二叉树的基本概念&#xff0c;本文将讲解具体的实现 2.基本功能的实现 2.1获取树中节点个数 public int size(TreeNode root){if(rootnull){return 0;}int retsize(root.left)size(root.right)1;return ret;}p…

蓝桥杯每日一题:奶牛回家(最短路径)

晚餐时间马上就到了&#xff0c;奶牛们还在各自的牧场中悠闲的散着步。 当农夫约翰摇动铃铛&#xff0c;这些牛就要赶回牛棚去吃晚餐。 在吃晚餐之前&#xff0c;所有奶牛都在自己的牧场之中&#xff0c;有些牧场中可能没有奶牛。 每个牧场都通过一条条道路连接到一个或多个…

【C++算法模板】KMP算法:字符串匹配算法

文章目录 0&#xff09;概述1&#xff09;求解next数组2&#xff09;求解匹配位置的核心函数3&#xff09;完整代码 0&#xff09;概述 在做模式串与文本串的匹配问题时&#xff0c;匹配失败时&#xff0c;如果每次都只向后递进一位&#xff0c;时间复杂度为 O ( n m ) O(nm…

314_C++_QT表格的撤销、恢复,可对多行、多item进行撤销、恢复操作

行–删除后的,撤销、恢复图示: 原图示 删除后 撤销操作 恢复操作 item修改后的撤销、恢复 原item 撤销修改 恢复修改 代码: --</

[开发日志系列]PDF图书在线系统20240415

20240414 Step1: 创建基础vueelment项目框架[耗时: 1h25min(8:45-10:10)] 检查node > 升级至最新 (考虑到时间问题,没有使用npm命令行执行,而是觉得删除重新下载最新版本) > > 配置vue3框架 ​ 取名:Online PDF Book System 遇到的报错: 第一报错: npm ERR! …

实时避障系统开启盲人独立出行新时代

作为一名资深记者&#xff0c;我始终关注并报道科技如何助力特殊群体克服生活挑战的创新实践。近期&#xff0c;我有幸深入了解了一款专为盲人设计的辅助应用叫做蝙蝠避障&#xff0c;它以实时避障系统为核心&#xff0c;为视障人士独自出行提供了强有力的支持&#xff0c;悄然…

服务器挖矿病毒解决ponscan,定时任务解决

服务器挖矿病毒解决ponscan&#xff0c;定时任务解决 挖矿病毒会隐藏chattr的操作权限&#xff0c;让我们无法删除病毒文件&#xff0c;杀掉病毒进程。所以要去下载chattr.c的文件&#xff0c;编译成a.out。然后再对原来的chattr文件的权限进行修改。然后覆盖掉它。 chattr.c …

JavaFX制作login页面

JavaFx制作简单的login页面demo public class LoginFxDemo extends Application {public static void main(String[] args) {Application.launch(args);}Overridepublic void start(Stage primaryStage) throws Exception {Label nLabel new Label("姓名:");nLabel.…

编曲知识19:自动化处理 发送原理 混响 延迟

自动化处理 发送原理 混响 延迟小鹅通-专注内容付费的技术服务商https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_661a68eae4b023c0a96a8b36?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv 自动化处理 自动化 鼠标挪动到轨道左下角打开自动化轨道 或右键轨道-左键单击…

Softmax函数和Sigmoid函数的思考

【为什么 Softmax 函数面对二分类问题时可以简化为 Sigmoid 函数】 将二分类问题当成普通多分类问题&#xff0c;神经网络如下所示&#xff1a; 因为有两个分类&#xff0c;所以需要有两个输出&#xff0c;然后经过 Softmax 后得到每个分类的预测概率。 假设第一个分类的得分…

独孤思维:喜欢看小姐姐跳舞,没法赚钱

01 独孤写文章的第一年&#xff0c;有一个同行特别有意思。 主动找我&#xff0c;说文章写得不错&#xff0c;想打赏。 但是我没开打赏功能。 当时&#xff0c;我说感觉写得并不好&#xff0c;就没好意思开。 他说&#xff0c;没关系的&#xff0c;他就觉得写得好&#xf…

SpringBoot 日志系统解析

日志实现框架 常见框架: JULLogbacLog4jLog4j2 日志实现的抽象层 避免代码的改动影响用户的使用, 常见的: JCLSLF4J 日志发展历程 JDK1.3及以前, 通过System.(out | err).println打印, 存在巨大缺陷解决系统打印缺陷问题出现log4,2015年8月停止更新受到log4j影响, SUN公…

AI助力,程序员压力倍增?

讲动人的故事,写懂人的代码 你知道程序员现在在AI辅助编程时最头疼的事情是什么吗?就是怎么在改代码的时候保住小命。 大家都听过程序员因为工作太累导致过劳湿的事情。 无论是写新功能、修bug,还是更改系统配置,都得改代码。 现在有了AI的帮助,本应该轻松很多,为什么…

linux文件访问权限理解

目录 一&#xff0c;涉及指令: 二&#xff0c;权限的表示 三&#xff0c;权限命令使用 一&#xff0c;涉及指令: umask chmod chown/chgrp 二&#xff0c;权限的表示 rwx rwx r-x含义: 访问方式: r-可读;w-可写&#xff1b;x-可执行&#xff1b; 访问用户:u-所有者;…

css 实现排行榜向上滚动

使用动画实现无线向上滚动 复制一层dom&#xff0c;使用动画向上滚动&#xff0c;鼠标hover的时候暂停动画 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthd…

Vue中component lists rendered with v-for should have explicit keys异常

在 Vue.js 中&#xff0c;当你在组件列表中使用 v-for 指令渲染多个组件时&#xff0c;每个组件元素都应当有一个明确的 key 属性。Vue.js 引擎通过这个 key 来优化虚拟 DOM 的 diff 过程&#xff0c;提升页面更新效率&#xff0c;并确保状态保持一致。 例如&#xff0c;如果你…

Java Lambda表达式

Lambda表达式是Java 8中引入的一种新特性&#xff0c;它允许你以更简洁的方式编写匿名函数。Lambda表达式主要用于简化集合操作、线程创建等场景。以下是Lambda表达式的详解&#xff1a; Lambda表达式的基本语法&#xff1a; (parameters) -> expression或者 (parameters…

02 | 事件驱动框架(Get/Set)

02 | 事件驱动框架&#xff08;Get/Set&#xff09; 【程序员的末路诗】01 aeEventLoop数据结构1&#xff09;aeEventLoop2&#xff09;aeFileEvent3&#xff09;aeTimeEvent 02 epoll 实例创建&#xff08;epoll_create&#xff09;1&#xff09;创建eventLoop结构体2&#xf…

香港科技大学广州|智能制造学域博士招生宣讲会—广州大学城专场

香港科技大学广州&#xff5c;智能制造学域博士招生宣讲会—广州大学城专场 时间&#xff1a;2024年4月18日&#xff08;星期四&#xff09;14:30 地点&#xff1a;广州市大学城雅乐轩酒店二楼策略2厅&#xff08;地铁大学城南站C口&#xff09; 报名链接&#xff1a;https:/…

记录西门子:增量编码器使用

编码器功能实现&#xff1a; 1、显示角度0~360 2、显示编码器速度 3、掉电保持当前角度 4、一键定位功能---改变当前角度为180 5、通过Z相不断纠偏角度 实物编码器&#xff1a; 接线图&#xff1a; 接到PLC的高速计数点位 方案一&#xff1a;200-Smart 方案二&#xff1a;1…