0

我有一个初学者问题:

我有 3 个类扩展 Thread。他们在做同样的工作:打开一个 ServerSocket,然后在一个 while 循环中等待连接。这些类之间的唯一区别是,当它们有连接时,它们会启动一个特定的线程。我想简化这一点,让一个班级做这项工作,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();
    }
4

2 回答 2

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();
}
}
于 2013-02-28T10:17:50.530 回答
0

您可以有一个 Server 类,它在构造函数中接收一个 SocketThreadFactory。

或者,服务器可以是抽象的,子类应该实现 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);
}

现在定义三个(或更多)简单的子类,它们只处理给定套接字的线程创建。

于 2013-02-28T10:19:34.737 回答