【发布时间】:2016-03-20 03:37:55
【问题描述】:
我有一个服务器,它接受多个客户端连接并执行以下操作
客户端1向服务器发送一行信息,等待服务器端操作完成 Clients 2 向服务器发送一行信息,等待服务器端操作完成
服务器在收到来自两个客户端的信息时执行某个操作,通知两个客户端并再次进入等待状态,让两个客户端传输他们的信息行,但是我编写的代码似乎没有以适当的方式工作。
服务器代码片段:
class ServerPattern extends Thread{
@Override
public void run() {
try
{
while(moreData){
if(clientId==1){
synchronized (BaseStation.sourceAReadMonitor){
BaseStation.sourceAReadComplete = false;
SourceARead.complete();
BaseStation.sourceAReadMonitor.notifyAll();
}
}
else if(clientId==2){
BaseStation.sourceBReadComplete = false;
}
//this.wait();
synchronized(BaseStation.patternGenerationReadMonitor){
BaseStation.patternGenerationReadMonitor.wait();
}
}
}
newSock.close();
}
catch(Exception e){
e.printStackTrace();
}
}
客户端代码片段:
class sReadA extends Thread {
public static void serverJobComplete(){
System.out.println("Source A Server job complete , Notifying Thread");
synchronized(BaseStation.sourceAReadMonitor){
BaseStation.sourceAReadMonitor.notifyAll();
}
}
//public void readFile(){
public void run() {
try {
while((line = br.readLine())!= null){
synchronized (BaseStation.sourceAReadMonitor){
if(BaseStation.patternGenerationComplete == true && BaseStation.sourceAReadComplete == false){
BaseStation.sourceAReadComplete = true;
BaseStation.sourceAReadMonitor.wait();
}
else if (BaseStation.sourceAReadComplete == true)
{
synchronized (BaseStation.patternGenerationReadMonitor){
BaseStation.patternGenerationReadMonitor.notifyAll();
}
}
}
}
//ToDo : Wait for ServerSide Operation to Complete, later iterate till end of file
}
catch(Exception e){
e.printStackTrace();
}
}
}
公共类 SourceARead {
public static void complete(){
System.out.println("Complete Called");
sReadA.serverJobComplete();
}
public static void main(String args[]){
sReadA sAR = new sReadA(fName);
sAR.start();
}
}
【问题讨论】:
-
你想用 notify 从客户端通知服务器?由于它们在不同的进程甚至不同的机器上运行,它怎么能工作? Wait 和 notifyAll 用于在线程之间而不是在客户端和服务器之间同步任务。
-
感谢您的回复,但是我如何让这两个不同的进程相互等待......
标签: java multithreading asynchronous wait