View Javadoc

1   /*
2    *   @(#) $Id: BlockingSet.java 210062 2005-07-11 03:52:38Z trustin $
3    *
4    *   Copyright 2004 The Apache Software Foundation
5    *
6    *   Licensed under the Apache License, Version 2.0 (the "License");
7    *   you may not use this file except in compliance with the License.
8    *   You may obtain a copy of the License at
9    *
10   *       http://www.apache.org/licenses/LICENSE-2.0
11   *
12   *   Unless required by applicable law or agreed to in writing, software
13   *   distributed under the License is distributed on an "AS IS" BASIS,
14   *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   *   See the License for the specific language governing permissions and
16   *   limitations under the License.
17   *
18   */
19  package org.apache.mina.util;
20  
21  import java.util.HashSet;
22  import java.util.Iterator;
23  
24  /***
25   * A {@link HashSet} that can wait until it is not empty.
26   * 
27   * @author Trustin Lee (trustin@apache.org)
28   * @version $Rev: 210062 $, $Date: 2005-07-11 12:52:38 +0900 $
29   */
30  public class BlockingSet extends HashSet
31  {
32      private static final long serialVersionUID = 3258134669538309941L;
33  
34  	private int waiters = 0;
35  
36      public synchronized boolean add( Object o )
37      {
38          boolean ret = super.add( o );
39          if( ret && waiters > 0 )
40              notify();
41          return ret;
42      }
43  
44      public Iterator iterator()
45      {
46          return super.iterator();
47      }
48  
49      public synchronized boolean remove( Object o )
50      {
51          return super.remove( o );
52      }
53  
54      public synchronized void waitForNewItem() throws InterruptedException
55      {
56          waiters++;
57          try
58          {
59              while( isEmpty() )
60              {
61                  wait();
62              }
63          }
64          finally
65          {
66              waiters--;
67          }
68      }
69  }