不管多线程的挑战仍然被使用的原因,是因为多线程仍然有几个益处,这些益处中的一些是:
更好的资源利用
在一些场景下简单的程序设计
更快响应的程序
更好的资源利用
想象一个应用读取和处理来自于本地文件系统的文件。让我们说从磁盘中读取一个文件花费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慢很多。
更简单的程序设计
如果你正在单线程应用中手工的编写上面的读取和处理文件的顺序的程序,你将不得不跟踪每一个文件的读取和处理的状态。代替的,你可以启动两个线程,每一个线程都只是读取和处理一个单独的文件。这些线程中的每一个当等待磁盘读取文件的时候都会被堵塞。当等待的时候,其他的线程可以使用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中文网(m.sbmmt.com)!