上述例子其实具有一般性。如果在一个长时间计算任务(维持动画)期间需要对输入输 出事件(鼠标或键盘指令)做出反应,单线程程序是不行的,因为程序会阻塞在长时间计算 任务上,没有机会来检查输入输出。而如果用一个线程来执行这个长时间计算任务,并让另 一个线程监控输入输出事件,两个线程的并发执行就可以使应用程序在执行计算任务的同时 能对用户输入作出反应。如图 9.2 所示。
图 9.2 多线程的应用
虽然多线程技术有很多用途,但掌握多线程编程有点难度,即使对职业程序员也是如此。 例如,多线程技术涉及所谓竞态条件(race condition),即因为未曾预料到的、对事件之间 相对时序的严重依赖而导致的异常行为。具体例子如:两个客户同时登录订票网站,都看到 某航班还剩一个座位,于是都下单预定该座位,最终必然会因为谁先来后到而引起纠纷。如 果两人是在售票点排队购票(串行执行)就没有这个问题。因此,多线程程序与串行程序是 不同的,需要分析并协调各线程间的复杂的执行时序,这导致编程和调试都很困难。