给定两台服务器Server1.java
和Server2.java
。他们的任务是以相同的方式从客户端套接字收集一些数据,然后对其进行不同的操作。
首先,他们都将每个客户端套接字连接委托给一个新的Thread,以便能够同时处理多个客户端。由于它们执行相同的操作来收集数据,因此Thread的Runnable的run()方法中的代码对于两个服务器可能是相同的。 ..所以基本上他们都可以使用同一个类来创建Thread。
但是:问题是,在这个Runnable中的一个地方,服务器已经做了不同的事情作为另一个非阻塞操作,所以基本上应该从这个Thread与Runnables启动新的Thread,这些Runnables已经因服务器而异。这两条服务器的单行不一样。
这就是让我无助的现在如何重用Runnable的其他部分,尽管两个服务器除了一行代码之外完全相同。
我说清楚了吗?
(我能想到的一个选择是创建一个带有参数的原始线程,该参数告诉它应该在那个时候调用哪个Runnable但这不是一件好事。)
那么这样做的正确方法是什么?这是我试图实现的正常程序吗?
代码段:
在Server1.java
和Server2.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
// ...
}
// ...
}
}
答案 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>