2014-04-23 46 views
0

我在我的多线程应用程序中的类之间的交互中遇到了一些困难,我的主聊天服务器类首先创建一个DBConnection管理器类,然后为连接到我的服务器的每个客户端创建一个线程。当客户端连接时,我将连接传递给客户端线程,以便客户端可以与数据库进行交互,然后在完成时将连接返回到池。如何正确构造我的类

问题发生,如果连接到数据库下降,我的客户端线程无法重新建立数据库连接池,因为它可以重新初始化的唯一方式是与其“超级”对话,现在我不能使用超级语句作为我的clientThread范围线程而不是我的主要聊天服务器类。我怎么解决这个问题?

回答

0

委托通常是比继承更好的设计选择。 Foo 已有一个酒吧经常给你比Foo更多的选择一个吧。

我clientThread程度线程

不要那样做。你的clientThread对象应该是一个普通的Thread,它是由一些实现了Runnable的ClientFoobar对象构造的。

class Client implements Runnable { 
    private final DBConnectionManager dbConnectionManager; 
    private ...other state... 

    public Client(DBConnectionManager dbConnectionManager,...) { 
     this.dbConnectionManager = dbConnectionManager; 
     ... 
    } 

    @Override 
    public void run() { ...interact with remote client... } 
} 

Thread clientThread = new Thread(new Client(dbConnectionManager,...)).start(); 
+0

嗨詹姆斯,也许我没有解释好,我的主类创建数据库连接,我将它传递到每个线程,以便我不创建每个线程的连接,线程只是使一个连接(从连接池中拉出)需要数据交换时。基本上我需要让我的客户端线程与主要类进行通信,在主要类中,如果数据库连接断开,需要重新建立数据库连接。 –

+0

@XarionComoretto,将建立连接的代码作为Client类的一部分,并让服务器线程在构造客户端时传递客户端需要的所有对象作为参数将会更清晰。这正是我想用我的例子来说明的。 –

+0

谢谢,这将是一个问题,我要保持一个连接打开为每个客户端连接,因为你的解决方案建议,但如果我不来对我只需要将dbconnection管理器移动到客户端线程。 –

0

想通了,我怎么能使用一些你的洞察力的@詹姆斯

我改做:

public class clientThread extends Thread { 
    } 

要:

public class clientThread extends MultiThreadChatServer implements Runnable { 
    } 

这让我用我的超级类来重新初始化我的连接池,当它删除数据库连接。

在我的Main类中MultithreadChatServer我创建了一个函数来重新启动数据库连接(这也是在应用程序启动时调用的)现在,我的每个线程都会在需要时使用池中的连接(只需要使池足够大,当然)

相关问题