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();
}
}
İ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. –
Cevabınız için teşekkürler, ancak bu iki farklı işlemi birbirimizi nasıl beklerim? – user2634491