给定两个服务器,Server1.java
和Server2.java
。他们的任务是以相同的方式从客户端套接字收集一些数据,然后执行不同的操作。
首先,它们都将每个客户端套接字连接委托(delegate)给一个新的线程,以便能够同时处理多个客户端。由于它们执行相同的操作来收集数据,因此该线程的Runnable的run()方法中的代码对于两个服务器而言可能是相同的。 ..因此,基本上,它们都可以使用相同的类来创建线程。
但是:问题在于,在此Runnable的某个位置,服务器已经作为另一种非阻塞操作进行了不同的操作,因此,基本上,应该从此Thread启动具有服务器已经不同的Runnable的新线程。这两条线对于两台服务器而言是不同的。
这就是让我现在束手无策的地方,我该如何重用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
// ...
}
// ...
}
}
最佳答案
我只看到评论/您的帖子中已经概述的选项,但有一些变化:
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/