2016-03-20 28 views
0
ben, birden fazla müşteri bağlantılarını kabul ve

Java bekleme(), notifyall(), beklendiği gibi çalışmıyor

Müşteri 1 sunucuya bilgi bir satır iletir aşağıdaki işlemleri gerçekleştirir tek Sunucu sunucu tarafında bekler var

işlemi tamamlamak için İstemciler 2 Sunucuya bir bilgi iletimi iletir, sunucu tarafı işleminin her iki istemciden bilgi aldığında sunucu tarafı işleminin

sunucusunu tamamlamasını bekler, istemciyi uyarır ve her ikisini de bekler. Her iki müşterinin de kendi bilgi satırını iletmesi için devlet, ama nasıl yazdım kodu ile nasıl uygun bir wa çalışıyor olmayacağını görünüyor y.

Sunucu Kod Parçacığı:

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(); 
    }  
} 

Müşteri Kod Parçacığı:

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(); 
    } 
} 

}

public class 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(); 

} 

}

+0

İstemciden sunucuyu bilgilendirmek için lütfen uyarmak ister misiniz? Farklı süreçlerde ve hatta farklı makinelerde çalıştıkları için nasıl çalışır? Bekle ve notifyAll istemci ile sunucu arasında olmayan iş parçacıkları arasındaki görevleri senkronize etmek için kullanılır. –

+0

Cevabınız için teşekkürler, ancak bu iki farklı işlemi birbirimizi nasıl beklerim? – user2634491

cevap

0

Bunun ile karşılaştığınız sorunun ne olduğunu açıklayabilir misiniz?

Bu gereksinim için HTTP sunucu bağlantı noktasını kullanmalısınız. Sunucu tarafında bir sunucu tipi bağlantı noktası açın ve istemciler bu bağlantı noktasına bağlanır. java.net API bunun için yararlı olabilir.

Bu gereksinim için, iş parçacığı düzeyinde denetim olduğundan ve JVM uygulamasına bağlı olduğundan beklemeli/bildirilmemelisiniz. Tüm nesneler iş parçacığı bekleme listesinden çıkar.

Gereksiniminiz buysa, doğru nesne üzerinde eşitleme yaptığınızdan emin olun.

bildirmek beklemek ya da aynı JVM

BaseStation.patternGenerationReadMonitor.notifyAll() altında çalışan birden çok iş parçacığı için bildirir; BaseStation üzerinde değil, geçerli nesneyi bekleyen konuları bildirir.

Bu sorunun sorununu düzeltir

İlgili konular