سؤال

لدي منزل نمت ملقم ويب في التطبيق.ملقم ويب هذا يولد موضوع جديد لكل طلب أن يأتي في المقبس أن تكون مقبولة.أريد ملقم ويب إلى الانتظار حتى نقطة محددة في الصفحات التي تم إنشاؤها فقط.

لقد تم من خلال العديد من المشاركات على هذا الموقع و الأمثلة على شبكة الإنترنت, ولكن غير قادر على الحصول على ملقم ويب إلى المضي قدما بعد أن أخبر موضوع الانتظار.الأساسية المثال رمز من شأنها أن تكون كبيرة.

هو الكلمة متزامنة الطريق الصحيح للذهاب حول هذا ؟ إذا كان الأمر كذلك ، كيف يمكن تحقيق ذلك ؟ أمثلة التعليمات البرمجية أدناه من بلدي التطبيق:

ملقم ويب

while (true) {
  //block here until a connection request is made
  socket = server_socket.accept();

  try {
    //create a new HTTPRequest object for every file request
    HttpRequest request = new HttpRequest(socket, this);

    //create a new thread for each request
    Thread thread = new Thread(request);

    //run the thread and have it return after complete
    thread.run();

    ///////////////////////////////
    wait here until notifed to proceed
    ///////////////////////////////
  } catch (Exception e) {
    e.printStackTrace(logFile);
  }
}

موضوع كود

public void run() {
  //code here

  //notify web server to continue here
}

التحديث النهائي البرمجية أدناه.على HttpRequest لا مجرد دعوة resumeListener.resume() عندما أرسل رأس استجابة (بالطبع أيضا إضافة واجهة كفئة منفصلة ، addResumeListener(ResumeListener r1) طريقة HttpRequest):

ملقم ويب جزء

// server infinite loop
while (true) {

  //block here until a connection request is made
  socket = server_socket.accept();

  try {
    final Object locker = new Object();

    //create a new HTTPRequest object for every file request
    HttpRequest request = new HttpRequest(socket, this);

    request.addResumeListener(new ResumeListener() {
      public void resume() {
        //get control of the lock and release the server
        synchronized(locker) {
          locker.notify();
        }
      }
    });

    synchronized(locker) {
      //create a new thread for each request
      Thread thread = new Thread(request);

      //run the thread and have it return after complete
      thread.start();

      //tell this thread to wait until HttpRequest releases
      //the server
      locker.wait();
    }
  } catch (Exception e) {
    e.printStackTrace(Session.logFile);
  }
}
هل كانت مفيدة؟

المحلول

أولا أنا صدى المشاعر من الآخرين أن إعادة اختراع العجلة هنا من المرجح أن يؤدي إلى مجموعة متنوعة من القضايا بالنسبة لك.ومع ذلك, إذا كنت تريد أن تذهب في هذا الطريق على أي حال ما كنت تحاول القيام به ليس من الصعب.هل جربت جيتي?

ربما شيء من هذا القبيل:

public class MyWebServer {

  public void foo() throws IOException {
    while (true) {
      //block here until a connection request is made
      ServerSocket socket = new ServerSocket();

      try {
        final Object locker = new Object();
        //create a new HTTPRequest object for every file request
        MyRequest request = new MyRequest(socket);
        request.addResumeListener(new ResumeListener() {
          public void resume() {
            locker.notify();
          }
        });
        synchronized(locker){

          //create a new thread for each request
          Thread thread = new Thread(request);

          //start() the thread - not run()
          thread.start();

          //this thread will block until the MyRequest run method calls resume
          locker.wait();
        }  
      } catch (Exception e) {
      }

    }
  }
}

public interface ResumeListener {
  public void resume();
}

public class MyRequest implements Runnable{
  private ResumeListener resumeListener;

  public MyRequest(ServerSocket socket) {
  }

  public void run() {
    // do something
    resumeListener.resume(); //notify server to continue accepting next request
  }

  public void addResumeListener(ResumeListener rl) {
    this.resumeListener = rl;
  }
}

نصائح أخرى

يمكنك استخدام java.util.المتزامنة.CountDownLatch مع العد من 1 عن هذا.ترتيب مثيل أنه تم مشاركتها من قبل الوالدين والطفل الموضوع (على سبيل المثال ، إنشاء في HttpRequest's منشئ ، ويكون ذلك استرجاعها من خلال وظيفة عضو).الملقم ثم يدعو await() و موضوع يضرب countDown() عندما انها على استعداد للافراج عن الأم.

ربما تحتاج إلى استخدام جافا الشرط.من مستندات:

الشروط (المعروف أيضا باسم الشرط طوابير أو شرط المتغيرات) توفر يعني موضوع واحد تعليق تنفيذ ("الانتظار") حتى إخطار من قبل مؤشر ترابط آخر أن بعض الدول الشرط قد يكون صحيحا.

تعمل تحت مصحح و تعيين نقطة توقف?

إذا كان غير مجد ، ثم قراءة سطر من النظام.؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top