Java wait(),notifyall(),没有按预期工作

时间:2016-03-20 03:37:55

标签: java multithreading asynchronous wait

我有一个服务器接受多个客户端连接并执行以下操作

客户端1向服务器发送一行信息,等待服务器端操作完成 客户端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();

}

}

1 个答案:

答案 0 :(得分:0)

您能描述一下您面临的问题吗?

您应该使用HTTP服务器端口来满足此要求。在服务器端打开服务器类型的端口,客户端将连接到此端口。 java.net API对此很有用。

您不应该使用wait / notify来满足此要求,因为它们是线程级别控制,它们取决于JVM实现。一旦当前正在运行的线程退出等待线程,所有对象都将拥有其线程等待列表。

如果这是您的要求,请确保您正在同步正确的对象。

wait notify或notify all用于在同一JVM下运行的多个线程

BaseStation.patternGenerationReadMonitor.notifyAll();将通知等待当前对象而不是BaseStation的线程。

希望这能解决您的问题