我在多线程应用程序中的类之间的交互中遇到了一些困难,我的主聊天服务器类首先创建一个DBConnection管理器类,然后为连接到我的服务器的每个客户端创建一个线程。当客户端连接时,我将连接传递给客户端线程,以便客户端可以与数据库交互,然后在完成时将连接返回到池。
问题是,如果与DB的连接断开,我的客户端线程无法重新建立数据库连接池,因为它可以重新初始化的唯一方法是与其超级&#39交谈;,现在我不能使用super语句作为我的clientThread范围Thread而不是我的主要chatserver类。我该如何解决这个问题?
答案 0 :(得分:0)
委托通常是比继承更好的设计选择。 Foo 有一个Bar经常比Foo 一个Bar提供更多选项。
我的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();
答案 1 :(得分:0)
弄清楚如何使用你的一些见解@james
来做到这一点我改变了:
public class clientThread extends Thread {
}
要:
public class clientThread extends MultiThreadChatServer implements Runnable {
}
这允许我在删除数据库连接时使用我的超类重新初始化我的连接池。
在我的Main类MultithreadChatServer中,我创建了一个重新启动数据库连接的函数(在应用程序启动时也会调用它)现在我的每个线程都会在需要时使用池中的连接(只需要当然,游泳池足够大)