Java简化了代码

时间:2013-02-28 10:13:56

标签: java

我有一个初学者问题:

我有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();
    }

2 个答案:

答案 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);
}

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