【发布时间】:2018-04-08 19:53:28
【问题描述】:
我正在做一个简单的项目:服务器在一个线程内执行一个从属(ReaderF 类),该线程读取一个文件,然后提取其内容并将其保存在服务器自己内部。然后,服务器需要执行一个池以在客户端连接时将内容发送给客户端。我首先编写 ReaderF 来提取内容。问题:它从不编辑他应该在其中存储内容的字符串变量。这是我所做的:
public class Serveur {
private ServerSocket serverSocket;
private Socket socket;
public String res=null; //This is what my thread is supposed to be editing
ExecutorService pool = null;
public static final int port = 33333;
Serveur(int port, int size){
try {
pool = Executors.newFixedThreadPool(5);
serverSocket = new ServerSocket(port, size);
} catch (IOException ex) {
Logger.getLogger(Serveur.class.getName()).log(Level.SEVERE, null, ex);
}
}
void manage () throws IOException {
while(true) {
ReaderF S = null;
try {
S = new ReaderF(serverSocket.accept(), this);
} catch (IOException e) {
e.printStackTrace();
}
Thread t=new Thread(S);
t.start();
}
}
这是读取和编辑 res 变量的从站。
public class ReaderF implements Runnable {
private final Socket socket;
private Serveur serverMaitre;
ReaderF(Socket socket, Serveur serverMaitre) {
this.socket = socket;
this.serverMaitre = serverMaitre;
}
public void run() {
String fileName = "/home/abdou/1.txt";
FileReader fileReader = null;
Writer output =null;
try {
fileReader = new FileReader(fileName);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try (BufferedReader bufferedReader = new BufferedReader(fileReader)) {
output = new OutputStreamWriter(socket.getOutputStream(), "8859_1");
String line;
String res="";
while((line = bufferedReader.readLine()) != null) {
res+=line+"\n";
}
serverMaitre.res=res; // This is where i tell him to edit res inside the server
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
当我执行这个 main 时,我在屏幕上什么也看不到。我知道这是因为服务器卡在了while循环中。
public class Main{
public static void main(String[] args) throws IOException {
Serveur serveur = new Serveur(Serveur.port, 1);
serveur.manage();
System.out.println("The res variable content is"+serveur.res);
}}
请问我该如何摆脱它。我的线程真的改变了 res 变量吗?谢谢
【问题讨论】:
-
如果在t.start()之后添加;线 t.join();你可能会看到结果。但是你的应用程序将无非是同步的(加入只是等待直到线程结束,所以就像你将直接运行 run() 方法的内容)。所以我可以假设这不是你想要的——不是吗?
标签: java multithreading sockets