多线程,可重用的Runnable,具有调用者特定的操作

时间:2017-10-23 18:09:00

标签: java multithreading

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

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

但是:问题是,在这个Runnable中的一个地方,服务器已经做了不同的事情作为另一个非阻塞操作,所以基本上应该从这个Thread与Runnables启动新的Thread,这些Runnables已经因服务器而异。这两条服务器的单行不一样。

这就是让我无助的现在如何重用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
            // ...
        }
        // ...
    }
}

1 个答案:

答案 0 :(得分:1)

我只看到评论/你的帖子中已经列出的选项,但有一些变化:

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创建自定义界面getHandlerRunnable(),而不是使用现有的通用Supplier<Runnable>

或者,您可以通过不使用getHandlerRunnable()而仅使用handleSomething(...)来改变逻辑,并让可能创建新线程并执行某些操作。< / p>