不管多线程的挑战仍然被使用的原因,是因为多线程仍然有几个益处,这些益处中的一些是:
更好的资源利用
在一些场景下简单的程序设计
更快响应的程序
更好的资源利用
立即学习“Java免费学习笔记(深入)”;
想象一个应用读取和处理来自于本地文件系统的文件。让我们说从磁盘中读取一个文件花费5秒钟,处理它花费2秒钟,执行两个文件将会花费:
5 seconds reading file A 2 seconds processing file A 5 seconds reading file B 2 seconds processing file B ----------------------- 14 seconds total
当从磁盘中读文件的时候,大部分的CPU时间都花费在等待文件读取上了。在那个时间CPU是相当空闲的。它可以做一些其他的事情。通过改变这个操作的顺序,CPU可以被更好的利用。看看这个顺序:
5 seconds reading file A 5 seconds reading file B + 2 seconds processing file A 2 seconds processing file B ----------------------- 12 seconds total
CPU等待第一个文件被读。然后它开始读取第二个文件。当第二个文件正在被读取的时候,这个CPU执行第一个文件。记住,当等待文件从磁盘中读取的时候,这个CPU大部分时间是空闲的。
通常情况下,CPU在等待IO的时候可以做一些其他的事情。它不一定必须是磁盘IO。它也可能是网络IO,或者是来自一个用户的输入。网络和磁盘IO比CPU的和内存IO慢很多。
更简单的程序设计
新版本程序更新主要体现在:完美整合BBS论坛程序,用户只须注册一个帐号,即可全站通用!采用目前流行的Flash滚动切换广告 变换形式多样,受人喜爱!在原有提供的5种在线支付基础上增加北京云网支付!对留言本重新进行编排,加入留言验证码,后台有留言审核开关对购物系统的前台进行了一处安全更新。在原有文字友情链接基础上,增加LOGO友情链接功能强大的6种在线支付方式可选,自由切换。对新闻列表进行了调整,
如果你正在单线程应用中手工的编写上面的读取和处理文件的顺序的程序,你将不得不跟踪每一个文件的读取和处理的状态。代替的,你可以启动两个线程,每一个线程都只是读取和处理一个单独的文件。这些线程中的每一个当等待磁盘读取文件的时候都会被堵塞。当等待的时候,其他的线程可以使用CPU去处理他们已经读到的文件的部分。这个结果就是磁盘将会一致保持忙碌状态,读取各种各样的文件进入内存。这个结果就是更好的利用了磁盘和CPU。它也会更简单的去编写程序,因为一个线程只是跟踪一个单独的文件。
更快响应的程序
另外一个公共的目标就是将一个单线程的应用转换成多线程的应用将会获得一个更快响应的应用。想象一个服务器应用,它正在监听进来请求的一些端口。当一个请求接收到了之后,他处理这个请求,然后再返回去监听。这个服务器循环概述如下:
while(server is active){
listen for request
process request
}
如果这个请求花费很长时间去处理,在那段时间中没有新的客户端发送请求到服务器。只有服务器可以监听接收的请求。
一个替换的设计就是对于监听的线程把一个请求传给一个worker线程,并且立刻返回监听。这个worker线程将会执行这个请求以及发送一个应答到客户端,这个设计概述如下
while(server is active){
listen for request
hand request to worker thread
}
这个方式,服务器线程将会很快返回到监听器。因此更多的客户端可以发送请求到服务器。这服务器变得更快的响应了。
对于桌面应用同样也是一样的。如果你点击一个按钮开启一个长时间的任务,并且正在执行任务的线程是这个正在更新窗口,按钮等等的线程,然后当任务执行的时候,这个应用出现不响应的情况。代替的,这个任务可以转换成一个worker线程。当worker线程忙着处理任务的时候,这个窗口线程可以空闲的去响应其他用户的请求。当worker线程完成的时候,它会发出信号通知窗口线程。这个窗口线程然后可以根据这个任务的结果更新应用窗口。使用worker线程设计的程序将会给予用户更快的响应。
以上就是Java 多线程好处的内容,更多相关内容请关注PHP中文网(www.php.cn)!










