加入收藏 | 设为首页 | 会员中心 | 我要投稿 济宁站长网 (https://www.0537zz.cn/)- 行业智能、边缘计算、专有云、AI硬件、5G!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

多线程开发中线程数量设计问题

发布时间:2019-09-27 02:51:06 所属栏目:优化 来源:道以致远
导读:前言 前面我们用了几篇文章系统的说了一下有关Java并发编程模型中的一些基础的知识。比如同步,锁,原子性操作,信号量等以及它们的一些延展实现闩锁,栅锁等等。 今天我们回过头来简单说一下并发编程模型的设计和选择。 主要涉及到我们如何利用多线程设计

具体实现过程怎么做呢?我们需要从这个站点的每一个页面开始,去搜索其每一个站内的链接,让后根据这些链接向其web服务器发送访问请求,由于涉及到网络请求,所以请求的响应时间就不确定了,某个请求可能需要很长时间才能收到回复。

同样,如果我们采用单线程的处理方式,那么这其中的等待回复时间可能是一个让人无法忍受的过程。而且在这等待期间,我们的应用程序可能啥都做不了。

如果我们可以将这份工作分配到多个线程,让一个或多个线程负责解析请求接收到的HTML页面,并将找到的链接放入队列,而其他线程则向web服务器发出请求,然后等待回复。如此我们的应用程序能够在新请求页面的等待时间里来解析已经接收的页面。

而我们知道涉及到网络传输的输入输出过程都是由我们的操作系统网卡负责的,也就是说我们的应用程序的线程只需要负责将请求发送出去,然后等待远程的网络回复即可,这等待期间线程可以做别的事情,而不必被阻塞等待。

同时由于我们的CPU要做的基本上就是响应一下输入输出操作开始和结束指令,做一些访问和存储线程处理工作,大部分时间应该都是响应事件处理。

此时我们的CPU可用内核处理过程是不需要线程绑定的,所以这类IO操作密集类型应用多线程时,我们可以在应用程序中添加多于可用CPU内核数的线程来充分利用其算力,那么这个应用程序甚至可能获得更好的性能。

简单来说,应用程序的性能意味着能在更短的时间内完成更多的任务。

我们再来看另外一种情况,在我们的图形用户界面(GUI)应用中,我们常常会遇见需要用户输入一些内容,然后单机处理按钮来提交数据给服务器进行处理这样的操作过程,在这个过程中,当我们单机按钮后,如果是单线程处理的情况下,应用程序会被阻塞,等待服务器处理的结果返回。

这时我们一般为了防止用户重复提交而将按钮变成不可用状态,服务器在后台处理数据期间用户就什么也做不了,只能等待服务器回复结果。这样的用户体验会很糟糕,如果处理时间稍长一些,鼠标都无法移动,就有可能给用户造成出问题卡死的错觉。

这个时候,我们完全可以采用多线程来处理,那就是设计一个额外的线程运行等待远程服务器处理结果,而当前的处理线程继续相应用户的其它操作请求。

当远程回复到达时,该线程负责响应。多线程在这类程序中的使用,会给用户带来良好的操作体验,大大提高应用程序的相应能力。

总结

这里我们简单总结了一下,在现代多处理器或多内核环境下,如何通过多线程并发设计来提高我们应用程序的性能和响应性。

需要注意的是在设计时首先要确定我们应用程序的类型,是计算密集型还是I/O密集型,如果是计算密集型应用,那么我们设计线程的数量应该等同于我们所能使用的CPU内核数,反之,如果是I/O密集型应用,我们可以设置远大于可以CPU内核数的线程数来提高性能。

当然,所有的多线程并发编程模型都离不开对竞争资源的处理,这就需要我们充分的理解同步,锁,原子性操作,信号量,以及各种衍生的闩锁,栅锁等概念,熟练的在设计过程中对竞态资源进行保护处理了。

(编辑:济宁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读