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的顺序,就能够更好的利用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 thread),然后立刻返回去监听。而工作者线程则能够处理这个请求并发送一个回复给客户端。这种设计如下:
while(server is active){
listen for request
hand request to worker thread
}
这种方式,服务端线程快速地返回去监听。因此,更多的客户端能够发送请求给服务端。这个服务端也变得响应更快。
桌面应用程序也是同样如此。如果你点击一个按钮开始运行一个长期的任务,这个线程既要执行任务又要更新窗口和按钮,那么在任务执行的过程中,这个应用程序看起来好像没有反应一样。相反,任务可以传递给工作者线程。当工作者线程在繁忙地处理任务的时候,窗口线程可以自由地响应其他用户的请求。当工作者线程完成任务的时候,它发送信号给窗口线程。窗口线程便可以更新应用程序窗口,并显示任务的结果。对用户而言,这种具有工作者线程设计的程序显得响应速度更快。
原文http://tutorials.jenkov.com/java-concurrency/benefits.html