亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

ZooKeeper典型應用(二) 生產者與消費者

系統 1791 0

?

In this tutorial, we show simple implementations of barriers and producer-consumer queues using ZooKeeper. We call the respective classes Barrier and Queue. These examples assume that you have at least one ZooKeeper server running.

本文將告訴你如何使用 Zookeeper 實現兩種常用的分布式數據結構,屏障(barriers)?和隊列(queues),我們為此還分別實現了兩個類:Barrier and Queue. 本文中的例子假設你已經成功運行了Zookeeper服務器。

Both primitives use the following common excerpt of code:

      
        static
      
       ZooKeeper zk = 
      
        null
      
      
        ;

    
      
      
        static
      
      
         Integer mutex;



    String root;



    SyncPrimitive(String address) {

        
      
      
        if
      
      (zk == 
      
        null
      
      
        ){

            
      
      
        try
      
      
         {

                System.out.println(
      
      "Starting ZK:"
      
        );

                zk 
      
      = 
      
        new
      
       ZooKeeper(address, 3000, 
      
        this
      
      
        );

                mutex 
      
      = 
      
        new
      
       Integer(-1
      
        );

                System.out.println(
      
      "Finished starting ZK: " +
      
         zk);

            } 
      
      
        catch
      
      
         (IOException e) {

                System.out.println(e.toString());

                zk 
      
      = 
      
        null
      
      
        ;

            }

        }

    }



    
      
      
        synchronized
      
      
        public
      
      
        void
      
      
         process(WatchedEvent event) {

        
      
      
        synchronized
      
      
         (mutex) {

            mutex.notify();

        }

    }
      
    

Both classes extend SyncPrimitive. In this way, we execute steps that are common to all primitives in the constructor of SyncPrimitive. To keep the examples simple, we create a ZooKeeper object the first time we instantiate either a barrier object or a queue object, and we declare a static variable that is a reference to this object. The subsequent instances of Barrier and Queue check whether a ZooKeeper object exists. Alternatively, we could have the application creating a ZooKeeper object and passing it to the constructor of Barrier and Queue.

We use the process() method to process notifications triggered due to watches. In the following discussion, we present code that sets watches. A watch is internal structure that enables ZooKeeper to notify a client of a change to a node. For example, if a client is waiting for other clients to leave a barrier, then it can set a watch and wait for modifications to a particular node, which can indicate that it is the end of the wait. This point becomes clear once we go over the examples.

Barriers

A barrier is a primitive that enables a group of processes to synchronize the beginning and the end of a computation. The general idea of this implementation is to have a barrier node that serves the purpose of being a parent for individual process nodes. Suppose that we call the barrier node "/b1". Each process "p" then creates a node "/b1/p". Once enough processes have created their corresponding nodes, joined processes can start the computation.

In this example, each process instantiates a Barrier object, and its constructor takes as parameters:

  • the address of a ZooKeeper server (e.g., "zoo1.foo.com:2181")

  • the path of the barrier node on ZooKeeper (e.g., "/b1")

  • the size of the group of processes

The constructor of Barrier passes the address of the Zookeeper server to the constructor of the parent class. The parent class creates a ZooKeeper instance if one does not exist. The constructor of Barrier then creates a barrier node on ZooKeeper, which is the parent node of all process nodes, and we call root (Note: This is not the ZooKeeper root "/").

      
        /**
      
      
        

         * Barrier constructor

         *

         * 
      
      
        @param
      
      
         address

         * 
      
      
        @param
      
      
         root

         * 
      
      
        @param
      
      
         size

         
      
      
        */
      
      
        

        Barrier(String address, String root, 
      
      
        int
      
      
         size) {

            
      
      
        super
      
      
        (address);

            
      
      
        this
      
      .root =
      
         root;

            
      
      
        this
      
      .size =
      
         size;

            
      
      
        //
      
      
         Create barrier node
      
      
        if
      
       (zk != 
      
        null
      
      
        ) {

                
      
      
        try
      
      
         {

                    Stat s 
      
      = zk.exists(root, 
      
        false
      
      
        );

                    
      
      
        if
      
       (s == 
      
        null
      
      
        ) {

                        zk.create(root, 
      
      
        new
      
      
        byte
      
      [0
      
        ], Ids.OPEN_ACL_UNSAFE,

                                CreateMode.PERSISTENT);

                    }

                } 
      
      
        catch
      
      
         (KeeperException e) {

                    System.out

                            .println(
      
      "Keeper exception when instantiating queue: "

                                    +
      
         e.toString());

                } 
      
      
        catch
      
      
         (InterruptedException e) {

                    System.out.println(
      
      "Interrupted exception"
      
        );

                }

            }

            
      
      
        //
      
      
         My node name
      
      
        try
      
      
         {

                name 
      
      = 
      
        new
      
      
         String(InetAddress.getLocalHost().getCanonicalHostName().toString());

            } 
      
      
        catch
      
      
         (UnknownHostException e) {

                System.out.println(e.toString());

            }

        }
      
    

To enter the barrier, a process calls enter(). The process creates a node under the root to represent it, using its host name to form. the node name. It then wait until enough processes have entered the barrier. A process does it by checking the number of children the root node has with "getChildren()", and waiting for notifications in the case it does not have enough. To receive a notification when there is a change to the root node, a process has to set a watch, and does it through the call to "getChildren()". In the code, we have that "getChildren()" has two parameters. The first one states the node to read from, and the second is a boolean flag that enables the process to set a watch. In the code the flag is true.

      
        /**
      
      
        

         * Join barrier

         *

         * 
      
      
        @return
      
      
        

         * 
      
      
        @throws
      
      
         KeeperException

         * 
      
      
        @throws
      
      
         InterruptedException

         
      
      
        */
      
      
        boolean
      
       enter() 
      
        throws
      
      
         KeeperException, InterruptedException{

            zk.create(root 
      
      + "/" + name, 
      
        new
      
      
        byte
      
      [0
      
        ], Ids.OPEN_ACL_UNSAFE,

                    CreateMode.EPHEMERAL_SEQUENTIAL);

            
      
      
        while
      
       (
      
        true
      
      
        ) {

                
      
      
        synchronized
      
      
         (mutex) {

                    List list 
      
      = zk.getChildren(root, 
      
        true
      
      
        );

                    
      
      
        if
      
       (list.size() <
      
         size) {

                        mutex.wait();

                    } 
      
      
        else
      
      
         {

                        
      
      
        return
      
      
        true
      
      
        ;

                    }

                }

            }

        }
      
    

Note that enter() throws both KeeperException and InterruptedException, so it is the reponsability of the application to catch and handle such exceptions.

Once the computation is finished, a process calls leave() to leave the barrier. First it deletes its corresponding node, and then it gets the children of the root node. If there is at least one child, then it waits for a notification (obs: note that the second parameter of the call to getChildren() is true, meaning that ZooKeeper has to set a watch on the the root node). Upon reception of a notification, it checks once more whether the root node has any child.

      
        /**
      
      
        

         * Wait until all reach barrier

         *

         * 
      
      
        @return
      
      
        

         * 
      
      
        @throws
      
      
         KeeperException

         * 
      
      
        @throws
      
      
         InterruptedException

         
      
      
        */
      
      
        boolean
      
       leave() 
      
        throws
      
      
         KeeperException, InterruptedException{

            zk.delete(root 
      
      + "/" + name, 0
      
        );

            
      
      
        while
      
       (
      
        true
      
      
        ) {

                
      
      
        synchronized
      
      
         (mutex) {

                    List list 
      
      = zk.getChildren(root, 
      
        true
      
      
        );

                        
      
      
        if
      
       (list.size() > 0
      
        ) {

                            mutex.wait();

                        } 
      
      
        else
      
      
         {

                            
      
      
        return
      
      
        true
      
      
        ;

                        }

                    }

                }

        }

    }
      
    

Producer-Consumer Queues

A producer-consumer queue is a distributed data estructure thata group of processes use to generate and consume items. Producer processes create new elements and add them to the queue. Consumer processes remove elements from the list, and process them. In this implementation, the elements are simple integers. The queue is represented by a root node, and to add an element to the queue, a producer process creates a new node, a child of the root node.

The following excerpt of code corresponds to the constructor of the object. As with Barrier objects, it first calls the constructor of the parent class, SyncPrimitive, that creates a ZooKeeper object if one doesn't exist. It then verifies if the root node of the queue exists, and creates if it doesn't.

      
        /**
      
      
        

         * Constructor of producer-consumer queue

         *

         * 
      
      
        @param
      
      
         address

         * 
      
      
        @param
      
      
         name

         
      
      
        */
      
      
        

        Queue(String address, String name) {

            
      
      
        super
      
      
        (address);

            
      
      
        this
      
      .root =
      
         name;

            
      
      
        //
      
      
         Create ZK node name
      
      
        if
      
       (zk != 
      
        null
      
      
        ) {

                
      
      
        try
      
      
         {

                    Stat s 
      
      = zk.exists(root, 
      
        false
      
      
        );

                    
      
      
        if
      
       (s == 
      
        null
      
      
        ) {

                        zk.create(root, 
      
      
        new
      
      
        byte
      
      [0
      
        ], Ids.OPEN_ACL_UNSAFE,

                                CreateMode.PERSISTENT);

                    }

                } 
      
      
        catch
      
      
         (KeeperException e) {

                    System.out

                            .println(
      
      "Keeper exception when instantiating queue: "

                                    +
      
         e.toString());

                } 
      
      
        catch
      
      
         (InterruptedException e) {

                    System.out.println(
      
      "Interrupted exception"
      
        );

                }

            }

        }
      
    

A producer process calls "produce()" to add an element to the queue, and passes an integer as an argument. To add an element to the queue, the method creates a new node using "create()", and uses the SEQUENCE flag to instruct ZooKeeper to append the value of the sequencer counter associated to the root node. In this way, we impose a total order on the elements of the queue, thus guaranteeing that the oldest element of the queue is the next one consumed.

      
        /**
      
      
        

         * Add element to the queue.

         *

         * 
      
      
        @param
      
      
         i

         * 
      
      
        @return
      
      
        */
      
      
        boolean
      
       produce(
      
        int
      
       i) 
      
        throws
      
      
         KeeperException, InterruptedException{

            ByteBuffer b 
      
      = ByteBuffer.allocate(4
      
        );

            
      
      
        byte
      
      
        [] value;

            
      
      
        //
      
      
         Add child with value i
      
      
                    b.putInt(i);

            value 
      
      =
      
         b.array();

            zk.create(root 
      
      + "/element"
      
        , value, Ids.OPEN_ACL_UNSAFE,

                        CreateMode.PERSISTENT_SEQUENTIAL);

            
      
      
        return
      
      
        true
      
      
        ;

        }
      
    

To consume an element, a consumer process obtains the children of the root node, reads the node with smallest counter value, and returns the element. Note that if there is a conflict, then one of the two contending processes won't be able to delete the node and the delete operation will throw an exception.

A call to getChildren() returns the list of children in lexicographic order. As lexicographic order does not necessary follow the numerical order of the counter values, we need to decide which element is the smallest. To decide which one has the smallest counter value, we traverse the list, and remove the prefix "element" from each one.

      
        /**
      
      
        

         * Remove first element from the queue.

         *

         * 
      
      
        @return
      
      
        

         * 
      
      
        @throws
      
      
         KeeperException

         * 
      
      
        @throws
      
      
         InterruptedException

         
      
      
        */
      
      
        int
      
       consume() 
      
        throws
      
      
         KeeperException, InterruptedException{

            
      
      
        int
      
       retvalue = -1
      
        ;

            Stat stat 
      
      = 
      
        null
      
      
        ;

            
      
      
        //
      
      
         Get the first element available
      
      
        while
      
       (
      
        true
      
      
        ) {

                
      
      
        synchronized
      
      
         (mutex) {

                    List list 
      
      = zk.getChildren(root, 
      
        true
      
      
        );

                    
      
      
        if
      
       (list.size() == 0
      
        ) {

                        System.out.println(
      
      "Going to wait"
      
        );

                        mutex.wait();

                    } 
      
      
        else
      
      
         {

                        Integer min 
      
      = 
      
        new
      
       Integer(list.get(0).substring(7
      
        ));

                        
      
      
        for
      
      
        (String s : list){

                            Integer tempValue 
      
      = 
      
        new
      
       Integer(s.substring(7
      
        ));

                            
      
      
        //
      
      
        System.out.println("Temporary value: " + tempValue);
      
      
        if
      
      (tempValue < min) min =
      
         tempValue;

                        }

                        System.out.println(
      
      "Temporary value: " + root + "/element" +
      
         min);

                        
      
      
        byte
      
      [] b = zk.getData(root + "/element" +
      
         min,

                                    
      
      
        false
      
      
        , stat);

                        zk.delete(root 
      
      + "/element" + min, 0
      
        );

                        ByteBuffer buffer 
      
      =
      
         ByteBuffer.wrap(b);

                        retvalue 
      
      =
      
         buffer.getInt();

                        
      
      
        return
      
      
         retvalue;

                    }

                }

            }

        }

    }
      
    

完整代碼如下:

      
        SyncPrimitive.Java


      
      
        import
      
      
         java.io.IOException;


      
      
        import
      
      
         java.net.InetAddress;


      
      
        import
      
      
         java.net.UnknownHostException;


      
      
        import
      
      
         java.nio.ByteBuffer;


      
      
        import
      
      
         java.util.List;


      
      
        import
      
      
         java.util.Random;


      
      
        import
      
      
         org.apache.zookeeper.CreateMode;


      
      
        import
      
      
         org.apache.zookeeper.KeeperException;


      
      
        import
      
      
         org.apache.zookeeper.WatchedEvent;


      
      
        import
      
      
         org.apache.zookeeper.Watcher;


      
      
        import
      
      
         org.apache.zookeeper.ZooKeeper;


      
      
        import
      
      
         org.apache.zookeeper.ZooDefs.Ids;


      
      
        import
      
      
         org.apache.zookeeper.data.Stat;


      
      
        public
      
      
        class
      
       SyncPrimitive 
      
        implements
      
      
         Watcher {

    
      
      
        static
      
       ZooKeeper zk = 
      
        null
      
      
        ;

    
      
      
        static
      
      
         Integer mutex;

    String root;

    SyncPrimitive(String address) {

        
      
      
        if
      
      (zk == 
      
        null
      
      
        ){

            
      
      
        try
      
      
         {

                System.out.println(
      
      "Starting ZK:"
      
        );

                zk 
      
      = 
      
        new
      
       ZooKeeper(address, 3000, 
      
        this
      
      
        );

                mutex 
      
      = 
      
        new
      
       Integer(-1
      
        );

                System.out.println(
      
      "Finished starting ZK: " +
      
         zk);

            } 
      
      
        catch
      
      
         (IOException e) {

                System.out.println(e.toString());

                zk 
      
      = 
      
        null
      
      
        ;

            }

        }

        
      
      
        //
      
      
        else mutex = new Integer(-1);
      
      
            }

    
      
      
        synchronized
      
      
        public
      
      
        void
      
      
         process(WatchedEvent event) {

        
      
      
        synchronized
      
      
         (mutex) {

            
      
      
        //
      
      
        System.out.println("Process: " + event.getType());
      
      
                    mutex.notify();

        }

    }

    
      
      
        /**
      
      
        

     * Barrier

     
      
      
        */
      
      
        static
      
      
        public
      
      
        class
      
       Barrier 
      
        extends
      
      
         SyncPrimitive {

        
      
      
        int
      
      
         size;

        String name;

        
      
      
        /**
      
      
        

         * Barrier constructor

         *

         * 
      
      
        @param
      
      
         address

         * 
      
      
        @param
      
      
         root

         * 
      
      
        @param
      
      
         size

         
      
      
        */
      
      
        

        Barrier(String address, String root, 
      
      
        int
      
      
         size) {

            
      
      
        super
      
      
        (address);

            
      
      
        this
      
      .root =
      
         root;

            
      
      
        this
      
      .size =
      
         size;

            
      
      
        //
      
      
         Create barrier node
      
      
        if
      
       (zk != 
      
        null
      
      
        ) {

                
      
      
        try
      
      
         {

                    Stat s 
      
      = zk.exists(root, 
      
        false
      
      
        );

                    
      
      
        if
      
       (s == 
      
        null
      
      
        ) {

                        zk.create(root, 
      
      
        new
      
      
        byte
      
      [0
      
        ], Ids.OPEN_ACL_UNSAFE,

                                CreateMode.PERSISTENT);

                    }

                } 
      
      
        catch
      
      
         (KeeperException e) {

                    System.out

                            .println(
      
      "Keeper exception when instantiating queue: "

                                    +
      
         e.toString());

                } 
      
      
        catch
      
      
         (InterruptedException e) {

                    System.out.println(
      
      "Interrupted exception"
      
        );

                }

            }

            
      
      
        //
      
      
         My node name
      
      
        try
      
      
         {

                name 
      
      = 
      
        new
      
      
         String(InetAddress.getLocalHost().getCanonicalHostName().toString());

            } 
      
      
        catch
      
      
         (UnknownHostException e) {

                System.out.println(e.toString());

            }

        }

        
      
      
        /**
      
      
        

         * Join barrier

         *

         * 
      
      
        @return
      
      
        

         * 
      
      
        @throws
      
      
         KeeperException

         * 
      
      
        @throws
      
      
         InterruptedException

         
      
      
        */
      
      
        boolean
      
       enter() 
      
        throws
      
      
         KeeperException, InterruptedException{

            zk.create(root 
      
      + "/" + name, 
      
        new
      
      
        byte
      
      [0
      
        ], Ids.OPEN_ACL_UNSAFE,

                    CreateMode.EPHEMERAL_SEQUENTIAL);

            
      
      
        while
      
       (
      
        true
      
      
        ) {

                
      
      
        synchronized
      
      
         (mutex) {

                    List list 
      
      = zk.getChildren(root, 
      
        true
      
      
        );

                    
      
      
        if
      
       (list.size() <
      
         size) {

                        mutex.wait();

                    } 
      
      
        else
      
      
         {

                        
      
      
        return
      
      
        true
      
      
        ;

                    }

                }

            }

        }

        
      
      
        /**
      
      
        

         * Wait until all reach barrier

         *

         * 
      
      
        @return
      
      
        

         * 
      
      
        @throws
      
      
         KeeperException

         * 
      
      
        @throws
      
      
         InterruptedException

         
      
      
        */
      
      
        boolean
      
       leave() 
      
        throws
      
      
         KeeperException, InterruptedException{

            zk.delete(root 
      
      + "/" + name, 0
      
        );

            
      
      
        while
      
       (
      
        true
      
      
        ) {

                
      
      
        synchronized
      
      
         (mutex) {

                    List list 
      
      = zk.getChildren(root, 
      
        true
      
      
        );

                        
      
      
        if
      
       (list.size() > 0
      
        ) {

                            mutex.wait();

                        } 
      
      
        else
      
      
         {

                            
      
      
        return
      
      
        true
      
      
        ;

                        }

                    }

                }

        }

    }

    
      
      
        /**
      
      
        

     * Producer-Consumer queue

     
      
      
        */
      
      
        static
      
      
        public
      
      
        class
      
       Queue 
      
        extends
      
      
         SyncPrimitive {

        
      
      
        /**
      
      
        

         * Constructor of producer-consumer queue

         *

         * 
      
      
        @param
      
      
         address

         * 
      
      
        @param
      
      
         name

         
      
      
        */
      
      
        

        Queue(String address, String name) {

            
      
      
        super
      
      
        (address);

            
      
      
        this
      
      .root =
      
         name;

            
      
      
        //
      
      
         Create ZK node name
      
      
        if
      
       (zk != 
      
        null
      
      
        ) {

                
      
      
        try
      
      
         {

                    Stat s 
      
      = zk.exists(root, 
      
        false
      
      
        );

                    
      
      
        if
      
       (s == 
      
        null
      
      
        ) {

                        zk.create(root, 
      
      
        new
      
      
        byte
      
      [0
      
        ], Ids.OPEN_ACL_UNSAFE,

                                CreateMode.PERSISTENT);

                    }

                } 
      
      
        catch
      
      
         (KeeperException e) {

                    System.out

                            .println(
      
      "Keeper exception when instantiating queue: "

                                    +
      
         e.toString());

                } 
      
      
        catch
      
      
         (InterruptedException e) {

                    System.out.println(
      
      "Interrupted exception"
      
        );

                }

            }

        }

        
      
      
        /**
      
      
        

         * Add element to the queue.

         *

         * 
      
      
        @param
      
      
         i

         * 
      
      
        @return
      
      
        */
      
      
        boolean
      
       produce(
      
        int
      
       i) 
      
        throws
      
      
         KeeperException, InterruptedException{

            ByteBuffer b 
      
      = ByteBuffer.allocate(4
      
        );

            
      
      
        byte
      
      
        [] value;

            
      
      
        //
      
      
         Add child with value i
      
      
                    b.putInt(i);

            value 
      
      =
      
         b.array();

            zk.create(root 
      
      + "/element"
      
        , value, Ids.OPEN_ACL_UNSAFE,

                        CreateMode.PERSISTENT_SEQUENTIAL);

            
      
      
        return
      
      
        true
      
      
        ;

        }

        
      
      
        /**
      
      
        

         * Remove first element from the queue.

         *

         * 
      
      
        @return
      
      
        

         * 
      
      
        @throws
      
      
         KeeperException

         * 
      
      
        @throws
      
      
         InterruptedException

         
      
      
        */
      
      
        int
      
       consume() 
      
        throws
      
      
         KeeperException, InterruptedException{

            
      
      
        int
      
       retvalue = -1
      
        ;

            Stat stat 
      
      = 
      
        null
      
      
        ;

            
      
      
        //
      
      
         Get the first element available
      
      
        while
      
       (
      
        true
      
      
        ) {

                
      
      
        synchronized
      
      
         (mutex) {

                    List list 
      
      = zk.getChildren(root, 
      
        true
      
      
        );

                    
      
      
        if
      
       (list.size() == 0
      
        ) {

                        System.out.println(
      
      "Going to wait"
      
        );

                        mutex.wait();

                    } 
      
      
        else
      
      
         {

                        Integer min 
      
      = 
      
        new
      
       Integer(list.get(0).substring(7
      
        ));

                        
      
      
        for
      
      
        (String s : list){

                            Integer tempValue 
      
      = 
      
        new
      
       Integer(s.substring(7
      
        ));

                            
      
      
        //
      
      
        System.out.println("Temporary value: " + tempValue);
      
      
        if
      
      (tempValue < min) min =
      
         tempValue;

                        }

                        System.out.println(
      
      "Temporary value: " + root + "/element" +
      
         min);

                        
      
      
        byte
      
      [] b = zk.getData(root + "/element" +
      
         min,

                                    
      
      
        false
      
      
        , stat);

                        zk.delete(root 
      
      + "/element" + min, 0
      
        );

                        ByteBuffer buffer 
      
      =
      
         ByteBuffer.wrap(b);

                        retvalue 
      
      =
      
         buffer.getInt();

                        
      
      
        return
      
      
         retvalue;

                    }

                }

            }

        }

    }

    
      
      
        public
      
      
        static
      
      
        void
      
      
         main(String args[]) {

        
      
      
        if
      
       (args[0].equals("qTest"
      
        ))

            queueTest(args);

        
      
      
        else
      
      
        

            barrierTest(args);

    }

    
      
      
        public
      
      
        static
      
      
        void
      
      
         queueTest(String args[]) {

        Queue q 
      
      = 
      
        new
      
       Queue(args[1], "/app1"
      
        );

        System.out.println(
      
      "Input: " + args[1
      
        ]);

        
      
      
        int
      
      
         i;

        Integer max 
      
      = 
      
        new
      
       Integer(args[2
      
        ]);

        
      
      
        if
      
       (args[3].equals("p"
      
        )) {

            System.out.println(
      
      "Producer"
      
        );

            
      
      
        for
      
       (i = 0; i < max; i++
      
        )

                
      
      
        try
      
      
        {

                    q.produce(
      
      10 +
      
         i);

                } 
      
      
        catch
      
      
         (KeeperException e){

                } 
      
      
        catch
      
      
         (InterruptedException e){

                }

        } 
      
      
        else
      
      
         {

            System.out.println(
      
      "Consumer"
      
        );

            
      
      
        for
      
       (i = 0; i < max; i++
      
        ) {

                
      
      
        try
      
      
        {

                    
      
      
        int
      
       r =
      
         q.consume();

                    System.out.println(
      
      "Item: " +
      
         r);

                } 
      
      
        catch
      
      
         (KeeperException e){

                    i
      
      --
      
        ;

                } 
      
      
        catch
      
      
         (InterruptedException e){

                }

            }

        }

    }

    
      
      
        public
      
      
        static
      
      
        void
      
      
         barrierTest(String args[]) {

        Barrier b 
      
      = 
      
        new
      
       Barrier(args[1], "/b1", 
      
        new
      
       Integer(args[2
      
        ]));

        
      
      
        try
      
      
        {

            
      
      
        boolean
      
       flag =
      
         b.enter();

            System.out.println(
      
      "Entered barrier: " + args[2
      
        ]);

            
      
      
        if
      
      (!flag) System.out.println("Error when entering the barrier"
      
        );

        } 
      
      
        catch
      
      
         (KeeperException e){

        } 
      
      
        catch
      
      
         (InterruptedException e){

        }

        
      
      
        //
      
      
         Generate random integer
      
      

        Random rand = 
      
        new
      
      
         Random();

        
      
      
        int
      
       r = rand.nextInt(100
      
        );

        
      
      
        //
      
      
         Loop for rand iterations
      
      
        for
      
       (
      
        int
      
       i = 0; i < r; i++
      
        ) {

            
      
      
        try
      
      
         {

                Thread.sleep(
      
      100
      
        );

            } 
      
      
        catch
      
      
         (InterruptedException e) {

            }

        }

        
      
      
        try
      
      
        {

            b.leave();

        } 
      
      
        catch
      
      
         (KeeperException e){

        } 
      
      
        catch
      
      
         (InterruptedException e){

        }

        System.out.println(
      
      "Left barrier"
      
        );

    }

}
      
    

?

ZooKeeper典型應用(二) 生產者與消費者


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 精品亚洲综合久久中文字幕 | 日本日韩欧美 | 成人在线免费网站 | 波多野吉衣一区二区三区在线观看 | 免费的黄色小视频 | 伊人久久成人爱综合网 | 国产一区二区亚洲精品天堂 | 欧美在线视频网 | 国产不卡视频在线 | 欧美午夜性春猛交 | 中文字幕在线视频观看 | 久久视频这里只精品3国产 久久视频这里只有精品 | 成年人国产视频 | 黄色网一级片 | 亚洲日本中文字幕 | 羞羞视频免费在线观看 | 99热久久这里只有精品6国产网 | 久久99精品久久久 | 天天射网站 | 国产成人精品高清免费 | 特级全黄一级毛片免费 | 青草香蕉精品视频在线观看 | 特黄特色大片免费播放器999 | 久久国产高清视频 | 亚洲va天堂va欧美ⅴa | 天天久久狠狠伊人第一麻豆 | 亚洲一级在线 | 有码在线| 国产一级免费视频 | 亚洲精品6久久久久中文字幕 | 毛片免费视频播放 | 深夜你懂的在线网址入口 | 黄色的网站在线观看 | 国产麻豆免费 | 国产一区二区精品久久岳 | 亚洲精品国产一区二区在线 | 这里只有精品免费视频 | 欧美一级在线全免费 | 免费在线激情视频 | 特黄a大片免费视频 | 免费看成人播放毛片 |