1 package org.sapia.ubik.net; 2 3 4 14 public class Semaphore { 15 public static final int NO_MAX = 0; 16 private int _maxThread = NO_MAX; 17 private int _count = 0; 18 private ThreadFactory _fac = new DefaultThreadFactory(); 19 20 26 public Semaphore(int maxThread) { 27 _maxThread = maxThread; 28 } 29 30 37 public Semaphore(int maxThread, ThreadFactory fac) { 38 this(maxThread); 39 _fac = fac; 40 } 41 42 45 synchronized void release() { 46 _count = (--_count < 0) ? 0 : _count; 47 } 48 49 55 public synchronized int getThreadCount() { 56 return _count; 57 } 58 59 69 public synchronized Thread acquireFor(Runnable r) 70 throws MaxThreadReachedException { 71 if ((_maxThread > 0) && (_count >= _maxThread)) { 72 throw new MaxThreadReachedException("" + _count); 73 } 74 75 _count++; 76 77 return _fac.newThreadFor(new SemaphoreRunnable(this, r)); 78 } 79 80 83 public static final class SemaphoreRunnable implements Runnable { 84 private Semaphore _sema; 85 private Runnable _toRun; 86 87 private SemaphoreRunnable(Semaphore s, Runnable toRun) { 88 _sema = s; 89 _toRun = toRun; 90 } 91 92 public final void run() { 93 _toRun.run(); 94 _sema.release(); 95 } 96 } 97 98 static final class DefaultThreadFactory implements ThreadFactory { 99 102 public Thread newThreadFor(Runnable r) { 103 return new Thread (r); 104 } 105 } 106 } 107 | Popular Tags |