0

私は初心者の質問があります:

スレッドを拡張する 3 つのクラスがあります。これらは同じ仕事をしています: ServerSocket を開き、while ループで接続を待ちます。これらのクラスの唯一の違いは、接続があるときに特定のスレッドを開始することです。私はこれを単純化し、1 つのクラスでその作業を行い、その atm 3 クラスが行っているようにしたいと考えています。この例では、SocketThread1、SocketThread2、および SocketThread3 の呼び出しのみが異なります。

クラスを 3 つではなく 1 つにするにはどうすればよいですか?

例:

\\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

コンストラクターで SocketThreadFactory を受け取るサーバー クラスを 1 つ持つことができます。

または、サブクラスが 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);
}

ここで、特定のソケットのスレッドの作成のみを処理する 3 つ (またはそれ以上) の単純なサブクラスを定義します。

于 2013-02-28T10:19:34.737 に答える