面试中常见的多线程类问题
- 格式:docx
- 大小:103.81 KB
- 文档页数:3
程序员八股文面试题
程序员八股文面试题通常是一些关于编程语言、算法和数据结构的经典问题,这些问题在不同的公司和面试中都可能被使用。
以下是一些常见的程序员八股文面试题:
1. 请你解释一下什么是冒泡排序,并给出一个示例代码。
2. 请你解释一下什么是二叉树,以及二叉树有哪些遍历方式。
3. 请你解释一下什么是栈,以及栈有哪些操作。
4. 请你解释一下什么是队列,以及队列有哪些操作。
5. 请你解释一下什么是链表,以及链表有哪些特点。
6. 请你解释一下什么是哈希表,以及哈希表有哪些应用场景。
7. 请你解释一下什么是递归,以及递归有哪些应用场景。
8. 请你解释一下什么是动态规划,以及动态规划有哪些应用场
景。
9. 请你解释一下什么是多线程,以及多线程有哪些应用场景。
10. 请你解释一下什么是异常处理,以及异常处理有哪些常见的错误类型。
这些问题都是为了测试程序员的基础知识和技能水平。
在回答这些问题时,建议先理解问题的背景和含义,然后给出清晰的答案,并尽量用简单的语言解释概念和代码实现。
同时,也需要对面试官的问题进行适当的扩展和讨论,以展示自己的专业能力和思维能力。
计算机基础知识面试题目及答案一、计算机基础知识1. 什么是二进制?答案:二进制是一种计算机使用的基础数制系统,仅包含数字0和1。
2. 什么是字节(Byte)?答案:字节是计算机表示数据的基本单位,通常由8个二进制位组成。
3. 请解释计算机的硬件和软件有什么区别?答案:计算机的硬件是指计算机的物理组件,如 CPU、内存和硬盘等。
而软件是指计算机程序及其相关数据,包括操作系统、应用程序和文件等。
4. 什么是操作系统?答案:操作系统是计算机系统的核心软件,负责管理和控制计算机的硬件和软件资源,提供给用户和应用程序一个可操作的接口。
5. 定义并区分编译和解释。
答案:编译是将程序源代码转化为机器可以执行的指令代码过程,生成可执行文件。
解释是逐行解析和执行源代码,不生成可执行文件。
二、计算机网络1. 什么是IP地址?答案:IP地址是互联网上唯一标识计算机的数字标签,用于在网络中进行通信和寻址。
2. 解释HTTP和HTTPS的区别。
答案:HTTP(超文本传输协议)是用于在Web浏览器和服务器之间传输数据的协议,而HTTPS(安全传输协议)是基于HTTP的安全版本,通过使用SSL/TLS加密保护数据传输的安全性。
3. 请说明什么是DNS服务器?答案:DNS服务器(域名系统服务器)负责将域名解析为对应的IP地址,使得用户在浏览器中输入域名后可以访问到对应的网站。
4. 什么是代理服务器?答案:代理服务器位于客户端和服务器之间,充当中间人的角色,通过转发请求和响应来增加网络资源的访问控制和性能优化。
5. 解释TCP和UDP的区别。
答案:TCP(传输控制协议)是一种面向连接的可靠传输协议,通过建立可靠的数据传输通道,确保数据的完整性和顺序。
UDP(用户数据报协议)是一种无连接的传输协议,将数据以数据包的形式发送,不保证数据的可靠性和顺序。
三、操作系统1. 解释进程和线程的概念。
答案:进程是计算机中正在执行的程序的实例,拥有独立的内存空间和系统资源。
第1篇一、基础知识1. Java简介题目:请简述Java的基本特点。
答案:- 简单易学:Java设计之初就考虑了易学性,使用面向对象编程。
- 原生跨平台:Java通过JVM(Java虚拟机)实现跨平台运行。
- 安全性:Java提供了强大的安全机制,如沙箱安全模型。
- 体系结构中立:Java不依赖于特定的硬件或操作系统。
- 高效:Java的运行速度接近C/C++。
- 多线程:Java内置多线程支持,便于实现并发处理。
- 动态性:Java在运行时可以进行扩展和修改。
2. Java虚拟机题目:请解释Java虚拟机(JVM)的作用。
答案:JVM是Java程序的运行环境,其主要作用包括:- 将Java字节码转换为本地机器码。
- 管理内存,包括堆、栈、方法区等。
- 提供垃圾回收机制。
- 管理线程和同步。
3. Java内存模型题目:请简述Java内存模型的组成。
答案:Java内存模型主要由以下部分组成:- 堆(Heap):存储对象实例和数组。
- 栈(Stack):存储局部变量和方法调用。
- 方法区(Method Area):存储类信息、常量、静态变量等。
- 本地方法栈(Native Method Stack):存储本地方法调用的相关数据。
- 程序计数器(Program Counter Register):存储线程的当前指令地址。
4. Java关键字题目:请列举并解释Java中的几个关键字。
答案:- `public`:表示访问权限为公开。
- `private`:表示访问权限为私有。
- `protected`:表示访问权限为受保护。
- `static`:表示属于类本身,而非对象实例。
- `final`:表示常量或方法不能被修改。
- `synchronized`:表示线程同步。
- `transient`:表示数据在序列化时不会被持久化。
二、面向对象编程5. 类和对象题目:请解释类和对象之间的关系。
答案:类是对象的模板,对象是类的实例。
第1篇一、引言CPU(中央处理器)作为计算机系统的核心部件,其性能直接影响到整个系统的运行效率。
在当今信息时代,随着计算机技术的飞速发展,对CPU性能的要求越来越高。
本面试题目旨在考察应聘者对CPU架构设计与性能优化的深入理解,以及在实际工作中如何运用这些知识解决实际问题。
二、面试内容第一部分:CPU基础知识1. 什么是CPU?请简要介绍CPU的发展历程。
2. CPU主要由哪些部分组成?请分别说明各部分的功能。
- 运算器- 控制器- 存储器- 输入/输出设备3. 请解释以下概念:- 主频- 缓存- 线程- 虚拟化- 异步处理4. CPU的指令集有哪些类型?请举例说明。
- RISC(精简指令集)- CISC(复杂指令集)- VLIW(超长指令字)5. 请简述CPU的流水线技术及其优势。
6. 什么是乱序执行?请解释其原理及对性能的影响。
第二部分:CPU架构设计1. 请比较以下两种CPU架构:- ARM架构- x86架构2. 请解释以下概念:- 乱序执行- 指令级并行- 超标量- 超流水线3. 请说明以下CPU架构设计原则:- 性能优先- 功耗优化- 尺寸控制- 可扩展性4. 请解释以下概念:- 同步多线程- 异步多线程- 多核处理器5. 请说明以下CPU缓存层次结构:- L1缓存- L2缓存- L3缓存6. 请解释以下概念:- 内存墙- 内存一致性- 缓存一致性协议第三部分:CPU性能优化1. 请列举几种常见的CPU性能瓶颈,并说明如何解决。
2. 请解释以下概念:- 代码优化- 内存优化- 硬件优化- 系统优化3. 请说明以下性能优化方法:- 指令重排- 代码缓存- 乱序执行- 多线程4. 请解释以下概念:- 数据局部性- 指令局部性- 程序局部性5. 请说明以下缓存优化方法:- 缓存大小- 缓存行大小- 缓存一致性- 缓存一致性协议第四部分:实际案例分析1. 请分析以下场景:- 在一个高并发场景下,如何优化CPU性能?- 在一个低功耗场景下,如何优化CPU性能?2. 请分析以下案例:- 某个应用程序在运行过程中CPU使用率过高,请分析原因并提出优化方案。
2024年Java经典面试题及答案问:Java中的泛型是什么?它有什么作用?答:Java中的泛型是一种参数化类型,它允许使用一个占位符来代表各种类型。
它的作用是在编译时检测类型的一致性,避免了类型转换错误,并提高了代码的重用性。
问:Java中的静态方法和实例方法有什么区别?答:静态方法是属于类的方法,可以在不创建实例对象的情况下被调用,它可以直接通过类名来调用。
实例方法是属于具体实例对象的方法,需要先创建实例对象才能调用。
问:Java中的反射是什么?它有什么用途?答:反射是指在运行状态中,动态获取类的信息并操作类的属性和方法。
它的主要用途是在运行时动态创建对象、访问属性和调用方法,以及在编译时无法确定类型的情况下进行操作。
问:Java中的多线程是什么?如何创建多线程?答:多线程是指在一个程序中同时执行多个线程,每个线程可以独立执行不同的任务。
要创建多线程可以通过继承Thread 类或实现Runnable接口来实现。
问:Java中的异常处理是什么?有哪些常见的异常类型?答:异常处理是指在程序执行过程中处理各种错误或异常情况。
常见的异常类型包括NullPointerException、ArrayIndexOutOfBoundsExcpetion、IOException等。
问:Java中的集合框架是什么?它有哪些常见的接口和类?答:集合框架是Java中用于存储和操作对象的数据结构。
常见的接口包括List、Set、Map等,常见的类包括ArrayList、LinkedList、HashSet、HashMap等。
问:Java中的IO流是什么?它有哪些常见的流类型?答:IO流是用于输入和输出操作的流。
常见的流类型包括字节流和字符流,分别对应InputStream/OutputStream和Reader/Writer。
在Java编程中, IO流是非常重要的一个概念。
IO流是用于将数据从一个地方传输到另一个地方的机制,它允许程序通过输入和输出来访问数据。
进程和线程⾯试题1、线程和进程线程:线程是进程的⼀个实体,是CPU调度和分派的基本单元。
进程:进程是具有⼀定独⽴功能的程序,它是系统进程资源分配和调度的⼀个独⽴单元。
区别:(1)⼀个线程只属于⼀个进程,⼀个进程包含⼀个或者多个线程。
(2)进程拥有独⽴的内存单元,⽽多个线程共享内存。
(3)进程的创建调⽤fork或者vfork,⽽线程的创建调⽤pthead_create,进程结束后它拥有的所有线程都将销毁,⽽线程的结束不会影响同个进程中的其他线程的结束。
(4)线程是轻量级的进程,它的创建和销毁所需要的时间⽐进程⼩很多,所有操作系统中的执⾏功能都是创建线程去完成的。
(5)线程中执⾏时⼀般都要进⾏同步和互斥,因为他们共享同⼀进程的资源。
2、死锁?死锁产⽣的原因?死锁的必要条件?怎么处理死锁?死锁:死锁是指两个或者两个以上的进程在执⾏过程中,由于竞争资源或者由于彼此通信⽽造成的⼀种阻塞的现象。
死锁原因:系统资源不⾜、相互竞争资源。
请求资源顺序不当死锁的必要条件:1.互斥条件:⼀个资源每次只能被⼀个进程使⽤。
2.请求和保持条件:⼀个进程因请求资源⽽阻塞时,对已获得的资源保持不放。
3.不可剥夺条件:进程已获得的资源,在未使⽤完之前,不能强⾏剥夺,只能在进程使⽤完时由⾃⼰释放。
4.循环等待条件:若⼲进程之间形成⼀种头尾相接的循环等待资源关系。
避免死锁的⽅法:因为互斥是不可改变的,所以只能破坏其他三个条件中的⼀个来解除死锁,⽅法:剥夺资源、杀死其中⼀个线程。
避免死锁最简单的⽅法就是阻⽌循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以⼀定的顺序做操作来避免死锁。
3、如何在Java中实现线程?(1)继承Thread类(2)实现Runnable接⼝(3)实现Callable接⼝通过FutureTask包装器来创建Thread线程(4)使⽤ExecutorService、Callable、Future实现有返回结果的多线程4、⽤Runnable还是Thread?Java不⽀持类的多重继承,但允许你调⽤多个接⼝(当然是调⽤Runnable接⼝更好)5、Thread类中start()和run()⽅法有什么区别?(1)start()⽅法被⽤来启动新创建的线程,⽽start()内部调⽤了run()⽅法。
10年工作经验java面试题
在面试中,可能会问到关于Java的各种问题,根据10年工作
经验,可能会涉及到更深入的问题。
以下是一些可能会被问到的
Java面试题:
1. 请介绍一下Java的特点和优点。
2. 什么是Java的多线程,如何实现多线程?
3. 请解释一下Java中的异常处理机制。
4. 什么是Java的反射(Reflection)?它有什么作用?
5. 请解释一下Java中的集合框架,以及它们的区别和用途。
6. 什么是Java的IO流?它们有哪些种类,各自的作用是什么?
7. 请解释一下Java中的继承、多态和封装的概念。
8. 什么是Java的JVM(Java虚拟机)?它的作用是什么?
9. 请介绍一下Java中常用的设计模式,以及它们的应用场景。
10. 请谈谈您在项目中遇到的Java性能优化经验。
以上问题涉及了Java的基础知识、高级特性以及实际应用经验,希望这些问题能够帮助您在面试中更好地展现您的技能和经验。
qt面试常见问题在Qt面试中,你可能会遇到一些关于Qt基础知识和应用的问题。
以下是一些常见的问题:1. Qt是什么?Qt是一个跨平台的C++应用程序开发框架,用于开发GUI应用程序。
2. Qt有哪些主要组件?Qt的主要组件包括Qt Widgets、Qt Quick、Qt QML、Qt Network、Qt SQL、Qt Multimedia等。
3. 什么是信号和槽?在Qt中,信号和槽是一种通信机制,用于对象之间的信息传递。
当某个事件发生时,发出信号的对象会发射一个信号,而接收信号的对象则通过槽函数来响应这个信号。
4. 如何在Qt中实现多线程?在Qt中,可以使用QThread类来实现多线程。
可以通过继承QThread类并重写其run()函数来创建线程,然后在run()函数中实现线程的逻辑。
5. 如何在Qt中处理事件和消息?在Qt中,可以使用事件处理机制来处理各种事件和消息,如鼠标事件、键盘事件等。
可以使用Qt的信号和槽机制来处理事件和消息。
6. 如何使用Qt进行数据库操作?在Qt中,可以使用Qt SQL模块来进行数据库操作。
可以使用QSqlDatabase类来连接数据库,使用QSqlQuery类来执行SQL语句并获取结果。
7. 如何使用Qt进行网络编程?在Qt中,可以使用Qt Network模块来进行网络编程。
可以使用QTcpSocket类来进行TCP通信,使用QUdpSocket类来进行UDP通信。
8. 如何使用Qt进行多媒体编程?在Qt中,可以使用Qt Multimedia模块来进行多媒体编程。
可以使用QMediaPlayer类来播放音频和视频文件。
这些问题只是一些常见的问题,面试官可能会根据你的经验和知识来提出更具体的问题。
银⾏java开发笔试⾯试题13道(含答案)1、在多线程环境中使⽤HashMap会有什么问题?在什么情况下使⽤get()⽅法会产⽣⽆限循环?HashMap本⾝没有什么问题,有没有问题取决于你是如何使⽤它的。
⽐如,你在⼀个线程⾥初始化了⼀个HashMap然后在多个其他线程⾥对其进⾏读取,这肯定没有任何问题。
有个例⼦就是使⽤HashMap来存储系统配置项。
当有多于⼀个线程对HashMap进⾏修改操作的时候才会真正产⽣问题,⽐如增加、删除、更新键值对的时候。
因为put()操作可以造成重新分配存储⼤⼩(re-sizeing)的动作,因此有可能造成⽆限循环的发⽣,所以这时需要使⽤Hashtable或者ConcurrentHashMap,⽽后者更优。
2、不重写Bean的hashCode()⽅法是否会对性能带来影响?这个问题⾮常好,每个⼈可能都会有⾃⼰的体会。
按照我掌握的知识来说,如果⼀个计算hash的⽅法写得不好,直接的影响是,当向HashMap中添加元素的时候会更频繁地造成冲突,因此最终增加了耗时。
但是⾃从Java 8开始,这种影响不再像前⼏个版本那样显著了,因为当冲突的发⽣超出了⼀定的限度之后,链表类的实现将会被替换成⼆叉树(binary tree)实现,这时你仍可以得到O(logN)的开销,优于链表类的O(n)。
3、对于⼀个不可修改的类,它的每个对象是不是都必须声明成final的?不尽然,因为你可以通过将成员声明成⾮final且private,并且不要在除了构造函数的其他地⽅来修改它。
不要为它们提供setter⽅法,同时不会通过任何函数泄露出对此成员的引⽤。
需要记住的是,把对象声明成final仅仅保证了它不会被重新赋上另外⼀个值,你仍然可以通过此引⽤来修改引⽤对象的属性。
这⼀点是关键,⾯试官通常喜欢听到你强调这⼀点。
4、String的substring()⽅法内部是如何实现的?⼜⼀个Java⾯试的好问题,你应该答出“substring⽅法通过原字符串创建了⼀个新的对象”,否则你的回答肯定是不能令⼈满意的。
第1篇一、背景型面试题1. 请用两三分钟谈谈你个人情况。
- 考察点:个人背景、兴趣爱好、职业规划等。
- 参考回答:“您好,我叫[姓名],毕业于[学校]的[专业],在校期间积极参与各类项目,培养了我的团队协作能力和解决问题的能力。
我对软件行业充满热情,尤其对[特定领域]感兴趣,希望能在贵公司发挥我的专业技能。
”2. 请做个简单的自我介绍。
- 考察点:自我认知、表达能力。
- 参考回答:“您好,我叫[姓名],目前从事[当前职业],具备[专业技能]和[工作经验]。
我性格开朗,善于沟通,对待工作认真负责,期待在贵公司发挥我的专长。
”3. 谈谈你个人近几年的情况和工作表现。
- 考察点:工作经历、能力提升。
- 参考回答:“近几年来,我在[公司名称]担任[职位],主要负责[工作内容]。
通过这些工作,我不仅提升了我的专业技能,还锻炼了我的团队协作和项目管理能力。
”二、行为面试题1. 你曾经遇到过一个难以解决的问题,你是如何解决的?- 考察点:问题解决能力、应变能力。
- 参考回答:“我曾遇到一个系统性能问题,通过分析日志和代码,我发现是某个模块存在内存泄漏。
我首先定位了泄漏源,然后提出优化方案,最终成功解决了问题。
”2. 请描述一次你带领团队完成一个重要项目的经历。
- 考察点:领导能力、团队协作。
- 参考回答:“在[公司名称],我带领团队完成了[项目名称]的开发。
我们首先制定了详细的项目计划,明确分工,确保每个人都知道自己的职责。
在项目过程中,我积极协调资源,解决团队成员之间的冲突,最终按时完成了项目。
”3. 你如何处理工作中的压力和挑战?- 考察点:应对压力的能力、心理素质。
- 参考回答:“面对压力和挑战,我会保持冷静,分析问题的根源,制定解决方案。
同时,我也会寻求同事和上级的帮助,共同应对困难。
”三、专业知识面试题1. 请解释一下什么是面向对象编程(OOP)?- 考察点:对OOP的理解。
- 参考回答:“面向对象编程是一种编程范式,它将数据和行为封装在对象中,通过继承、封装和多态等特性实现代码的重用和扩展。
面试中常见的多线程类问题
很多面试官都清楚,初级程序员对于多线程的掌握程度几乎为零。但是面试环节
中很多面试官都会抱着试一试的态度去提问一两道多线程的题目。其目的不是为
了难为面试者,也不是为了彰显面试的“高大上”,而是为了区别一般人才玉优
质人才。下面就是整理的一些多线程问题。
1、解释实现多线程的几种方法?
一Java线程可以实现Runnable接口或者继承Thread类来实现,当你打算多重继承
时,优先选择实现Runnable。
2、Thread.start()与Thread.run()有什么区别?
Thread.start()方法(native)启动线程,使之进入就绪状态,当cpu分配时间该
线程时,由JVM调度执行run()方法。
3、为什么需要run()和start()方法,我们可以只用run()方法来完
成任务吗?
我们需要run()&start()这两个方法是因为JVM创建一个单独的线程不同于普通
方法的调用,所以这项工作由线程的start方法来完成,start由本地方法实现,
需要显示地被调用,使用这俩个方法的另外一个好处是任何一个对象都可以作为
线程运行,只要实现了Runnable接口,这就避免因继承了Thread类而造成的Java
的多继承问题。
4、什么是ThreadLocal类,怎么使用它?
ThreadLocal是一个线程级别的局部变量,并非“本地线程”。ThreadLocal为每
个使用该变量的线程提供了一个独立的变量副本,每个线程修改副本时不影响其
它线程对象的副本(译者注)。
下面是线程局部变量(ThreadLocal variables)的关键点:
一个线程局部变量(ThreadLocal variables)为每个线程方便地提供了一个单独
的变量。
ThreadLocal实例通常作为静态的私有的(private static)字段出现在一个类中,
这个类用来关联一个线程。
当多个线程访问ThreadLocal实例时,每个线程维护ThreadLocal提供的独立的变
量副本。
常用的使用可在DAO模式中见到,当DAO类作为一个单例类时,数据库链接
(connection)被每一个线程独立的维护,互不影响。(基于线程的单例)
ThreadLocal难于理解,
5、什么时候抛出InvalidMonitorStateException异常,为什么?
调用wait()/notify()/notifyAll()中的任何一个方法时,如果当前线程没有获
得该对象的锁,那么就会抛出IllegalMonitorStateException的异常(也就是说
程序在没有执行对象的任何同步块或者同步方法时,仍然尝试调用
wait()/notify()/notifyAll()时)。由于该异常是RuntimeExcpetion的子类,所
以该异常不一定要捕获(尽管你可以捕获只要你愿意).作为RuntimeException,
此类异常不会在wait(),notify(),notifyAll()的方法签名提及。
6、Sleep()、suspend()和wait()之间有什么区别?
Thread.sleep()使当前线程在指定的时间处于“非运行”(Not Runnable)状态。
线程一直持有对象的监视器。比如一个线程当前在一个同步块或同步方法中,其
它线程不能进入该块或方法中。如果另一线程调用了interrupt()方法,它将唤
醒那个“睡眠的”线程。
注意:sleep()是一个静态方法。这意味着只对当前线程有效,一个常见的错误
是调用t.sleep(),(这里的t是一个不同于当前线程的线程)。即便是执行
t.sleep(),也是当前线程进入睡眠,而不是t线程。t.suspend()是过时的方法,
使用suspend()导致线程进入停滞状态,该线程会一直持有对象的监视器,
suspend()容易引起死锁问题。
object.wait()使当前线程出于“不可运行”状态,和sleep()不同的是wait是
object的方法而不是thread。调用object.wait()时,线程先要获取这个对象的
对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后
另一线程可以同步同一个对象锁来调用object.notify(),这样将唤醒原来等待
中的线程,然后释放该锁。基本上wait()/notify()与sleep()/interrupt()类似,
只是前者需要获取对象锁。
7、在静态方法上使用同步时会发生什么事?
同步静态方法时会获取该类的“Class”对象,所以当一个线程进入同步的静态
方法中时,线程监视器获取类本身的对象锁,其它线程不能进入这个类的任何静
态同步方法。它不像实例方法,因为多个线程可以同时访问不同实例同步实例方
法。
8、当一个同步方法已经执行,线程能够调用对象上的非同步实例方
法吗?
可以,一个非同步方法总是可以被调用而不会有任何问题。实际上,Java没有为
非同步方法做任何检查,锁对象仅仅在同步方法或者同步代码块中检查。如果一
个方法没有声明为同步,即使你在使用共享数据Java照样会调用,而不会做检查
是否安全,所以在这种情况下要特别小心。一个方法是否声明为同步取决于临界
区访问(critial section access),如果方法不访问临界区(共享资源或者数据结
构)就没必要声明为同步的。
9、在一个对象上两个线程可以调用两个不同的同步实例方法吗?
不能,因为一个对象已经同步了实例方法,线程获取了对象的对象锁。所以只有
执行完该方法释放对象锁后才能执行其它同步方法。
10、什么是死锁
死锁就是两个或两个以上的线程被无限的阻塞,线程之间相互等待所需资源。这
种情况可能发生在当两个线程尝试获取其它资源的锁,而每个线程又陷入无限等
待其它资源锁的释放,除非一个用户进程被终止。就JavaAPI而言,线程死锁可
能发生在一下情况。
1.当两个线程相互调用Thread.join()
2.当两个线程使用嵌套的同步块,一个线程占用了另外一个线程必需的锁,互相
等待时被阻塞就有可能出现死锁。
11、什么是线程饿死,什么是活锁?
线程饿死和活锁虽然不想是死锁一样的常见问题,但是对于并发编程的设计者来
说就像一次邂逅一样。
当所有线程阻塞,或者由于需要的资源无效而不能处理,不存在非阻塞线程使资
源可用。JavaAPI中线程活锁可能发生在以下情形:
1.当所有线程在程序中执行Object.wait(0),参数为0的wait方法。程序将发生
活锁直到在相应的对象上有线程调用Object.notify()或者Object.notifyAll()。
2.当所有线程卡在无限循环中。