Java 如何将套接字连接上接收的数据包排队,以便按照接收的顺序进行处理和UI更新
我有一个用户应用程序,它正在从套接字读取数据,并在更新表之前进行一些解析。输入数据的格式是大约每秒传输几行csv。我的连接类的当前实现包括在下面 UI上的handleDetectionEvent()使用工作线程适当地解析行并相应地更新表。我遇到的问题是,每一个新行都会生成一个新的工作线程,我不能保证表会按照收到的数据包的顺序进行更新,因此表中同一项的两次更新可能会导致较早的更新显示为最新的更新。我怎样才能防止这种情况Java 如何将套接字连接上接收的数据包排队,以便按照接收的顺序进行处理和UI更新,java,multithreading,swing,sockets,Java,Multithreading,Swing,Sockets,我有一个用户应用程序,它正在从套接字读取数据,并在更新表之前进行一些解析。输入数据的格式是大约每秒传输几行csv。我的连接类的当前实现包括在下面 UI上的handleDetectionEvent()使用工作线程适当地解析行并相应地更新表。我遇到的问题是,每一个新行都会生成一个新的工作线程,我不能保证表会按照收到的数据包的顺序进行更新,因此表中同一项的两次更新可能会导致较早的更新显示为最新的更新。我怎样才能防止这种情况 public class Connection implements Runn
public class Connection implements Runnable {
private Socket socket;
private BufferedReader bufferedReader;
DetectionManager manager;
public Connection(String sIpAddress, int iPortNumber) throws UnknownHostException, IOException{
socket = new Socket(sIpAddress, iPortNumber);
}
public void run(){
try {
String sCurrentLine;
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while ((sCurrentLine = bufferedReader.readLine()) != null) {
if (Thread.interrupted()){
closeConnection();
return;
}
manager.mUI.handleDetectionEvent(sCurrentLine);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void closeConnection(){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
您不需要任何辅助线程。您只需要一个从套接字读取所有数据的线程,当您得到一行数据时,您需要使用
SwingUtilities.invokeLater
与EDT(事件调度程序线程)同步。但解析在哪里完成?您可以在套接字连接器线程中创建表行,但要添加到表(模型)中必须在EDT中执行。如果解析一行所用的时间超过套接字上出现的连续行之间的时间间隔,这些行是否会自动排队,以便在当前实现中不会丢失行?我不知道套接字是否可以缓冲输入数据。但是如果没有,您可以将解析移到另一个线程(类java.util.concurrent.Executors)中,并从这个新线程中使用invokeLater调用通知EDT。