给定两个服务器,Server1.javaServer2.java。他们的任务是以相同的方式从客户端套接字收集一些数据,然后执行不同的操作。

首先,它们都将每个客户端套接字连接委托(delegate)给一个新的线程,以便能够同时处理多个客户端。由于它们执行相同的操作来收集数据,因此该线程的Runnable的run()方法中的代码对于两个服务器而言可能是相同的。 ..因此,基本上,它们都可以使用相同的类来创建线程。

但是:问题在于,在此Runnable的某个位置,服务器已经作为另一种非阻塞操作进行了不同的操作,因此,基本上,应该从此Thread启动具有服务器已经不同的Runnable的新线程。这两条线对于两台服务器而言是不同的。

这就是让我现在束手无策的地方,我该如何重用Runnable的其他部分,尽管除了一行代码外,这两种服务器的用法都完全相同。

我说清楚了吗?

(我可以想到的一个选择是用一个参数创建原始线程,该参数告诉它那时应该调用哪个Runnable,但这不是一件好事。)

那么,这样做的正确方法是什么?这是我尝试实现的所有正常程序吗?

代码段:

Server1.javaServer2.java中:

/* Creating a client socket every time a client connects to
 * the server and delegating its management to a new thread... */
for (; ; ) { new Thread(new DataReceiver(serverSocket.accept())).start(); }

DataReceiver.java中:
public class DataReceiver implements Runnable {

    private Socket clientSocket;
    private BufferedReader socketIn;

    public DataReceiver(Socket clientSocket) { /* ... */ }

    @Override
    public void run() {
        // ...
        while ((inputLine = socketIn.readLine()) != null) {
            // ...
            new Thread(new ThisClassOrThatClass()).start(); //the only difference
            // ...
        }
        // ...
    }
}

最佳答案

我只看到评论/您的帖子中已经概述的选项,但有一些变化:

for (; ; ) { new Thread(new DataReceiver(serverSocket.accept(), () -> new ThisClass())).start(); }

接着:
public class DataReceiver implements Runnable {

    private Socket clientSocket;
    private BufferedReader socketIn;
    private Supplier<Runnable> runnableSupplier;

    public DataReceiver(Socket clientSocket, Supplier<Runnable> runnableSupplier) { /* ... */ }

    @Override
    public void run() {
        // ...
        while ((inputLine = socketIn.readLine()) != null) {
            // ...
            new Thread(runnableSupplier.get()).start();
            // ...
        }
        // ...
    }
}

您可以使用方法Handler创建自定义接口(interface)getHandlerRunnable(),而不使用现有的通用Supplier<Runnable>

另外,您可以通过不使用getHandlerRunnable()而不是handleSomething(...)并允许该方法创建一个新的Thread并执行某些操作来以较小的方式更改逻辑。

关于java - 多线程,可重用Runnable,具有调用者特定的操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46895834/

10-15 02:00