概述
由于单线程本身的缺陷,目前绝大多数系统采用多线程的方式运行。虽然多线程提高了系统资源利用率,但同时也给系统带来了线程安全性问题。本篇就多线程的优势和缺陷系统的整理一下,在以后的开发过程中,根据不同的业务场景使用不同的线程模型,以达到更好的效果。
多线程的优势和缺陷
本篇就多线程的优势和缺陷分以下四个模块展开:
- 单线程应用的缺陷
- 多线程的优势
- 多线程的缺陷
- 常见的使用单/多线程的场景
1、单线程的缺陷
单线程应用顾名思义:整个系统的运行围绕一个线程来展开。
首先最容易想到的问题是线程异常终止:因为只有一个线程的原因,如果该线程阻塞或停止,整个系统都可能产生卡死等无法正常服务的情况。
其次,单线程应用的UI交互很差:当我们点击按钮,触发某个事件之后,在事件处理过程中,整个按钮可能处于“被点击”状态,这种状态下用户不能进行任何其他操作。即使我们通过一些手段让按钮回弹,但用户再次点击按钮将不会收到任何响应,甚至有可能产生意料之外的错误。
最重要的一点是,单线程应用几乎不能对多用户服务。在单线程应用为某个用户服务期间,其他用户发来的所有请求将会被忽略,这种情况导致的结果是:绝大多数情况下,绝大多数用户的请求不会被处理,这对于一款软件来说是完全没有用户体验而言的。
2、多线程的优势
多线程应用常见的优势无外乎以下几点:
- 系统资源利用率高
- 用户交互性高
- 极少数情况下开发更简单
2-1、系统资源利用率高
通常情况下,一个线程从头到尾的执行不仅仅需要CPU调度,大多数情况下还需要进行必要的 I/O 操作。在执行 I/O 操作期间,线程阻塞。
CPU操作通常情况下极快,而 I/O 操作相比CPU操作慢了数百倍,因此绝大多数情况下,CPU都处于等待 I/O 操作期间。因此在等待 I/O 操作期间,可以让CPU先执行其他线程,提高系统资源的利用率。
假设现在需要处理文件A和文件B,读取文件A需要5s,处理文件A需要2s,读取文件B需要5s,处理文件B需要4s,下面我们分别以单线程模型和多线程模型做简单分析:
单线程模型: