转载请注明出处:https://blog.csdn.net/qq_33427047/article/details/80454815
在上篇中已经实现了Java客户端远程调用Linux服务器深度模型并与之交互,本篇将对Java线程进行改进。
整个项目功能是:用户提问一个问题,client发送至server,返回answer。因此设计思路是:生成3个并发线程ABC:A用来启动模型;B用来和模型socket交互。与此同时,BC两个线程进行同步,依靠判断是否输入question来阻塞和唤醒。
已修改的代码如下:
/**
* 这个是Java client和python server通信的实践,server运行的是Parlai问答模型
* 这一版本是在服务器开启程序的情况下直接进行socket通信
*/
class Example {
private String return_answer, answer = ""; //用来返回模型的答案
private String guide_info = ""; //用来保存提示信息
private String question = ""; //用户提出的问题
private Socket socket; //client和服务器进行socket通信
private InputStream is;
private BufferedReader in;
private OutputStream os;
private PrintWriter pw;
private int judge_answer = 0; //判断是否有答案,没有就继续等待
public String getAnswer() {
//线程启动后,一直监测有没有答案生成。有答案生成,标志judge_answer会被置为1
while (true) {
if(judge_answer != 0) {
break;
}
try {
Thread.sleep(500);
} catch (Exception e) {}
}
return_answer = this.answer;
this.answer = ""; //重置
judge_answer = 0;
return return_answer; //返回某问题对应的答案
}
//当有新问题时,赋值给this.question
public void setQuestion(String question) {
this.question = question;
}
@SuppressWarnings("finally")
//与服务器模型进行socket连接
public String conn2server(String ip, int port) {
this.guide_info = "";
System.out.println("Socket connecting...");
try {
this.socket = new Socket(ip, port);
this.is = this.socket.get