快速业务通道

用Java Socket开发支持上千个并发的小型服务器(下) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-24
l(请记住它是一个LinkedList,保存等待处理的连接池)的synchronized块。我们这样做的原因是确保没有别人能跟我们同时修改连接池。

既然我们已经保证了我们是唯一“涉水”池中的人,我们就可以把传入的Socket添加到LinkedList的尾端。一旦我们添加了新的连接,我们就用以下代码通知其它正在等待该池的Thread,池现在已经可用:

pool.notifyAll();

Object的所有子类都继承这个notifyAll()方法。这个方法,连同我们下一屏将要讨论的wait()方法一起,就使一个Thread能够让另一个Thread知道一些条件已经具备。这意味着该第二个Thread一定正在等待那些条件的满足。

用Java Socket开发支持上千个并发的小型服务器(下)(7)

时间:2010-04-15

从池中获取连接

这里我们实现PooledConnectionHandler上需作改动的run()方法,它将在连接池上等待,并且池中一有连接就处理它:

1.public void run() {2.    while(true) {3.        synchronized(pool) {4.            while(pool.isEmpty()) {5.                try {6.                    pool.wait();7.                }8.                catch(InterruptedException e) {9.                    e.printStackTrace();10.                }11.            }12.            connection= (Socket)pool.remove(0);13.        }14.        handleConnection();15.    }16.}

回想一下在前面讲过的:一个Thread正在等待有人通知它连接池方面的条件已经满足了。在我们的示例中,请记住我们有三个PooledConnectionHandler在等待使用池中的连接。每个PooledConnectionHandler都在它自已的Thread中运行,并通过调用pool.wait()产生阻塞。当我们的processRequest()在连接池上调用notifyAll()时,所有正在等待的PooledConnectionHandler都将得到“池已经可用”的通知。然后各自继续前行调用pool.wait(),并重新检查while(pool.isEmpty())循环条件。除了一个处理程序,其它池对所有处理程序都将是空的,因此,在调用pool.wait()时,除了一个处理程序,其它所有处理程序都将再次产生阻塞。恰巧碰上非空池的处理程序将跳出while(pool.isEmpty())循环并攫取池中的第一个连接:

connection=(Socket)pool.remove(0);

处理程序一旦有一个连接可以使用,就调用handleConnection()处理它。

在我们的示例中,池中可能永远不会有多个连接,只是因为事情很快就被处理掉了。如果池中有一个以上连接,那么其它处理程序将不必等待新的连接被添加到池。当它们检查pool.isEmpty()条件时,将发现其值为假,然后就从池中攫取一个连接并处理它。

还有另一件事需注意。当run()拥有池的互斥锁时,processRequest()如何能够把连接放到池中呢?答案是对池上的wait()的调用释放锁,而wait()接着就在自己返回之前再次攫取该锁。这就使得池对象的其它同步代码可以获取该锁。

处理连接:再一次

这里我们实现需做改动的handleConnection()方法,该方法将攫取连接的流,使用它们,并在任务完成之后清除它们:

1.public void  handleConnection() {2.    try {3.        PrintWriter streamWriter = new PrintWriter(connection.getOutputStream());4.        BufferedReader streamReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));5.        String fileToRead = streamReader.readLine();6.        BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead));7.        String line = null;8.        while((line=fileReader.readLine())!=null)9.            streamWriter.println(line);10.        fileReader.close();11.       

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号