基本概念
什么是线程?
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,
即不同的线程可以执行同样的函数。
什么是多线程?
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,
也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
多线程的好处:
可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,
这样就大大提高了程序的效率。
多线程的不利方面:
线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
多线程需要协调和管理,所以需要CPU时间跟踪线程;
线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
线程太多会导致控制太复杂,最终可能造成很多Bug;
不同线程模型的适用场景
单线程单队列
可用作同步线程,将并发任务但是需要同步执行的任务投递到同步线程的任务队列中,可避免加锁的开销,CPU使用率最低,若不是无界队列则其内存使用率也比较低。
多线程单队列
可用作一般任务的处理线程,CPU利用率高于单线程单队列,但是会有同步加锁的性能开销。
多线程多队列
可用作IO线程,在读取IO数据时可将读取数据的任务根据不同的策略投递到不同队列中,最大化利用机器的CPU和内存资源。多线程多队列不适用于处理耗时不确定的任务,原因是任务在投递选择队列时,可能出现投递的队列对应的线程一直在阻塞,而其它队列的线程却是空闲的。
举个例子:任务的投递策略是选择任务数最少的队列优先投递,但有可能该任务队列中已有的任务处理耗时比较长,导致该任务对列的线程一直被占用,其它队列虽然任务数比较多,但是处理耗时都比较短,很快将队列中的任务处理完了。这就会导致任务被阻塞了,但是线程又没有被充分利用起来的现象。
总结
不同的线程模型有其各自的优缺点,在工作中需要根据具体的业务场景而来。单线程与多线程的区别参考链接