战五渣系列之六(5分钟还搞不懂多线程?)

来源:互联网 发布:程序员和投资银行 编辑:程序博客网 时间:2024/05/19 11:18

1.为什么需要多线程?

1.更好的利用多核cpu。让每个cpu都有活可干。

2.提高响应速度。不重要的事可以在后台慢慢干,例如记录日志等。(Android中不阻塞UI线程也属于第2条)

这2点就是使用多线程编程带来的好处!

2.多线程一定快吗?

  • 线程概念:线程是cpu不断的切换时间片。一个cpu同时只能干一件事情,因为每隔100毫秒(举例)切换到其他的线程任务上,让你误以为cpu在同时干好多事。

  • 线程的开销:

    • 创建线程。
    • 上下文切换。cpu从一个线程任务切换到另一个线程任务。

  • 多线程执行快:线程出现阻塞(例如io文件被其他程序占用阻塞),cpu切换到其他线程干活,切回来io不阻塞,两件事情都干了,所以快了。

  • 多线程执行慢:程序串行执行不会出现阻塞,因为开启了多个线程执行,增加了创建线程和上下问切换的开销,所以慢了。

3.线程如何优化?

通过上文,现在我们知道多线程的优化点在于:

1.利用多核cpu。真正的同时干多件事情,避免出现闲置的cpu,例如,4核却开启了2个线程。你的服务器是单核?

2.程序执行出现阻塞则切换到其他线程,避免cpu等待阻塞完成而浪费cpu。真的会出现阻塞吗?

4.合理的配置线程池

(参考《Java并发编程的艺术》)

a.为何使用线程池?

1.降低资源消耗,重复使用
2.提高响应速度,当任务到达时不需要重新创建线程。
3.可管理性,便于统一管理调优和监控。

b.配置线程池的因素

1.任务的性质:是否会出现阻塞。IO密集型等任务避免cpu因阻塞而等待,应多配置线程数量;CPU密集型任务,因为cpu一直在执行,应少配置线程数量减少上下文切换。如混合型可拆分成2个线程池。
2.任务的时间:高并发低耗时、低并发高耗时,各自选取什么样的线程池会比较合理?

5.小知识点

thread.join。为什么特意提到这些知识点呢,前段时间我发现项目单元测试中有很多sleep,我一直纳闷干什么呢?原来同事在一些操作中使用了多线程,而测试时子线程中的结果和异常都无法看到,所以在主线程中sleep 5 秒等待子线程执行完毕!为什么不使用join呢?呵呵!

CountDownLatch。同join,功能更强大一点。

CyclicBarrier。例如:拼车(每个线程)只有拼到20(线程组达到某个点)人时才发车(干某件事情)。

0 0
原创粉丝点击