用Java Socket开发支持上千个并发的小型服务器(下) - 编程入门网
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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |