我遇到類似情況,我提供了一個由字符串組成的日誌文件。我需要做的是,我需要從文件中檢索每個字符串並通過一個Socket,當文件結束時它必須再次返回到文件的開頭並再次發送字符串。我用一個發送字符串的無限線程寫了一個簡單的代碼,當EOF到來時,我正在關閉文件,並使用新的BufferedReader對象再次打開文件。我也給了少量的5毫秒線程睡眠,但一段時間後,我的進程進入暫停狀態(如死鎖)。無論如何提高轉移的速度?否則我可以消除暫停狀態。如何在Java中以非常快的速度從文件中檢索數據
下面是我的簡單代碼:
public class Write extends Thread{
private static final String FileName = "Messages.txt";
private static final int port = 8080;
private final int time = 5;
ServerSocket serverSocket;
Socket writeSocket;
@Override
public void run()
{
try
{
serverSocket = new ServerSocket(port);
System.out.println("Server listening on port " + port+ " ...");
Socket writeSocket = serverSocket.accept();
System.out.println("Connected to Client : "+ writeSocket.getLocalSocketAddress());
OutputStream outStream = writeSocket.getOutputStream();
PrintWriter out = new PrintWriter(outStream, true);
BufferedReader input = new BufferedReader(new FileReader(FileName));
String str = "";
while(true)
{
str = input.readLine();
if(str==null){
input.close();
input = new BufferedReader(new FileReader(FileName));
}
else{
System.out.println("Outgoing Message>>"+str);
out.println(str);
Thread.sleep(time);
}
}
}
catch(IOException e) {System.out.println(e); } catch (InterruptedException ex) {
Logger.getLogger(Write.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
讓我給你一個簡單的解釋。考慮上面的代碼是在一個服務器代碼中。當我在同一臺PC上運行客戶端計算機時,我可以以某種(高)速度發送消息,但在某段時間後,客戶端和服務器都進入暫停狀態。我覺得這就像死鎖。客戶端顯示爲「服務器已斷開連接並再次連接」。當我關閉客戶端時,再次服務器啓動。誰能告訴我有沒有辦法以非常高的速度處理琴絃?
那麼,如果你想走得快'Thread.sleep()'幾乎總是一個壞主意。 – markspace
客戶端代碼在哪裏? – RealSkeptic
對不起,我不能爲您提供客戶端代碼,因爲它是由其他人開發的,他們都提供了一個.exe文件。它是一個.Net客戶端,我的是一個Java服務器。 –