我有一个初学者问题:
我有3个类扩展Thread。他们正在做同样的工作:打开一个ServerSocket,然后在while循环中等待连接。这些类之间的唯一区别是,它们在连接时启动特定的线程。 我想简化这个并让一个Class做这个工作,atm 3个类正在做。在示例中,唯一的区别是SocketThread1,SocketThread2和SocketThread3的调用。
我如何制作1个课程而不是3个课程?
示例:
\\class 1
public void run()
{
while(true)
{
Socket s = serversocket.accept();
new SocketThread1(s).start();
}}
\\class 2
public void run()
{
while(true)
{
Socket s = serversocket.accept();
new SocketThread2(s).start();
}
}
\\class 3
public void run()
{
while(true)
{
Socket s = serversocket.accept();
new SocketThread3(s).start();
}
答案 0 :(得分:1)
为什么不为SocketThread 1,2和3实现一个接口(或父类),然后只传递一个这个接口的实例并调用它的start()方法?
编辑:我的意思是这样的:(代码未经过测试,应根据您的要求进行调整)
public class SocketThread1 implements SocketThread{...}
public class SocketThread2 implements SocketThread{...}
public class SocketThread3 implements SocketThread{...}
public class YourClass implements Runnable{
private SocketThread thread;
public YourClass(SocketThread thread){
this.thread = thread;
}
public void run()
{
thread.start();
}
}
答案 1 :(得分:0)
您可以拥有一个Server类,它在构造函数中接收SocketThreadFactory。
或者,Server可以是抽象的,其中子类应该实现createClientHandlerThread(Socket)方法:
public abstract class Server extends Thread {
private ServerSocket serverSocket;
public Server(int port) throws IOException {
serverSocket = new ServerSocket(port);
}
public void run() {
try {
while (true) {
Socket s = serverSocket.accept();
createClientHandlerThread(s).start();
}
} catch (IOException e) {
// TODO: handle the exception
}
}
protected abstract Thread createClientHandlerThread(Socket s);
}
现在定义三个(或更多)简单子类,它们只处理给定套接字的线程创建。