【问题标题】:Java wait(), notifyall(), not working as expectedJava wait(),notifyall(),没有按预期工作
【发布时间】: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


【解决方案1】:

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

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

您不应该对这个要求使用等待/通知,因为它们是线程级控制,并且取决于 JVM 实现。所有对象都有自己的线程等待列表,一旦当前运行的线程退出等待线程就会得到通知。

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

wait notify 或 notify all 是针对在同一个 JVM 下运行的多个线程

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

希望能解决你的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多