• Hadoop源码分析13: IPC流程(8) Server的wait、notify


    1.Serverwaitnotify

     

    public abstractclass Server {

     

          public synchronized void join()throws InterruptedException {

                 while (running){

                        wait();

                 }

          }     

     

          

          public synchronized void stop(){

                 LOG.info("Stopping server on" + port);

                 running =false;

                if (handlers !=null) {

                        for (int i = 0; i handlerCount; i++) {

                              if (handlers[i]!= null) {

                                     handlers[i].interrupt();

                              }

                        }

                 }

                 listener.interrupt();

                 listener.doStop();

                 responder.interrupt();

                 notifyAll();

          }

     

    }

     

    2. ServerListenerReaderwaitnotify

     

    publicclass ServerListenerReader implements Runnable{

     

       public void run(){

         synchronized (this) {

           while(serverListener.server.running) {

            SelectionKey key = null;

            try {

             readSelector.select();

              while (adding) {

               this.wait(1000);

              }            

     

             IteratorSelectionKey iter =readSelector.selectedKeys().iterator();

              while (iter.hasNext()){

                key =iter.next();

               iter.remove();

                if(key.isValid()) {

                 if (key.isReadable()) {

                  serverListener.doRead(key);

                 }

               }

                key =null;

              }

            } catch (InterruptedException e) {

              if(serverListener.server.running) {                  // unexpected -- log it

              }

            } catch (IOException ex) {

             }

          }

         }

       }

     

     

       public synchronized void finishAdd(){

         adding = false;

         this.notify();       

       }

    }

     

     

    3. ServerResponderwaitnotify

     

    publicclass ServerResponder extends Thread {

     

       public void run(){

             Server.SERVER.set(server);

         long lastPurgeTime = 0;  // last check for old calls.

     

         while (server.running){

           try{

           waitPending();    // If a channel is being registered,wait.

            writeSelector.select(PURGE_INTERVAL);

            IteratorSelectionKeyiter = writeSelector.selectedKeys().iterator();

            while (iter.hasNext()) {

              SelectionKey key =iter.next();

              iter.remove();

              try {

                if(key.isValid() && key.isWritable()) {

                   doAsyncWrite(key);

               }

              } catch (IOException e){

              }

            }

            long now =System.currentTimeMillis();

            if (now lastPurgeTime +PURGE_INTERVAL) {

              continue;

            }

            lastPurgeTime = now;

            //

            // If there were some calls that have not beensent out for a

            // long time, discard them.

            //

            ArrayListServerCallcalls;

            

            // get the list of channels from list ofkeys.

            synchronized (writeSelector.keys()) {

              calls = newArrayListServerCall(writeSelector.keys().size());

              iter =writeSelector.keys().iterator();

              while (iter.hasNext()){

               SelectionKey key = iter.next();

                ServerCallcall = (ServerCall)key.attachment();

                if (call!= null && key.channel() == call.connection.channel){ 

                 calls.add(call);

               }

              }

            }

            

            for(ServerCall call : calls) {

              try {

               doPurge(call, now);

              } catch (IOException e){

              }

            }

           } catch(OutOfMemoryError e) {

            //

            // we can run out of memory if we have too manythreads

            // log the event and sleep for a minute andgive

            // some thread(s) a chance to finish

            //

             try { Thread.sleep(60000); }catch (Exception ie) {}

           } catch(Exception e) {

           }

         }

        }

     

     

       private synchronized void waitPending()throws InterruptedException {

         while (pending0) {

          wait();

         }

       }

       private synchronized void decPending(){ // call done enqueueing.

         pending--;

         notify();

       }

     

    }

  • 相关阅读:
    人工智能,垂直领域
    西方企业该向中国式创新学什么?
    [Leetcode 6] ZigZag问题的一种新思路
    Unknown column '*' in 'field list' 异常解决
    多媒体——图像文件大小的计算
    Lucky Number
    win7 64位系统下进入debug
    Chromium网页DOM Tree创建过程分析
    做好长期奋斗的准备
    IP寻址和子网运算
  • 原文地址:https://www.cnblogs.com/leeeee/p/7276522.html
Copyright © 2020-2023  润新知