面试题答案
一键面试常见任务调度方式及原理、优缺点
- 线程池
- 工作原理:预先创建一定数量的线程,组成线程池。当有任务到达时,从线程池中取出一个空闲线程来执行任务,任务执行完毕后,线程不会销毁,而是返回线程池等待下一个任务。
- 优点:避免了频繁创建和销毁线程带来的开销,提高了线程的复用性,从而提高了系统的性能和响应速度;可以通过设置线程池的大小来控制并发度,防止系统因线程过多而导致资源耗尽。
- 缺点:线程池大小设置困难,设置过小会导致任务处理速度慢,设置过大则会消耗过多系统资源,甚至导致系统崩溃;线程池中的线程在执行 I/O 操作时,可能会因为等待 I/O 完成而阻塞,降低了线程的利用率。
- 事件驱动
- 工作原理:应用程序通过注册回调函数来响应特定的事件。当事件发生时,事件循环会检测到该事件,并调用相应的回调函数来处理事件。例如在网络编程中,当有新的连接请求、数据可读或可写等事件发生时,事件循环会触发相应的处理函数。
- 优点:非常适合处理 I/O 密集型任务,因为它不会为每个 I/O 操作创建新的线程或进程,大大减少了资源开销;能够高效地处理大量并发连接,因为事件循环是单线程的,避免了多线程编程中的锁竞争等问题,提高了系统的并发性和响应性能。
- 缺点:编程模型相对复杂,回调函数嵌套可能导致代码可读性变差,出现“回调地狱”问题;由于是单线程执行,对于 CPU 密集型任务,会导致整个事件循环阻塞,无法及时处理其他事件。
- 协程
- 工作原理:协程是一种用户态的轻量级线程,由程序自身控制调度。在一个线程内,可以有多个协程,协程之间可以通过 yield 关键字暂停和恢复执行。例如在网络 I/O 操作时,协程可以暂停执行,将执行权交给其他协程,当 I/O 操作完成后,再恢复执行。
- 优点:创建和切换开销极小,比线程更加轻量级,适合处理大量并发任务;可以像编写同步代码一样编写异步逻辑,避免了回调函数嵌套带来的代码复杂性,提高了代码的可读性和可维护性;不需要像多线程那样处理锁竞争等问题,因为协程是在单线程内执行的。
- 缺点:由于是单线程执行,对于 CPU 密集型任务无法利用多核 CPU 的优势;协程的调度依赖于程序员手动控制,在复杂场景下,调度逻辑可能变得复杂。