380 |
|
} |
381 |
|
} |
382 |
|
|
383 |
+ |
/** |
384 |
+ |
* drainPermits reports and removes given number of permits |
385 |
+ |
*/ |
386 |
+ |
public void testDrainPermits() { |
387 |
+ |
Semaphore s = new Semaphore(0, false); |
388 |
+ |
assertEquals(0, s.availablePermits()); |
389 |
+ |
assertEquals(0, s.drainPermits()); |
390 |
+ |
s.release(10); |
391 |
+ |
assertEquals(10, s.availablePermits()); |
392 |
+ |
assertEquals(10, s.drainPermits()); |
393 |
+ |
assertEquals(0, s.availablePermits()); |
394 |
+ |
assertEquals(0, s.drainPermits()); |
395 |
+ |
} |
396 |
|
|
397 |
|
/** |
398 |
|
* reducePermits reduces number of permits |
619 |
|
public void run() { |
620 |
|
try { |
621 |
|
s.acquire(); |
622 |
< |
s.release(); |
610 |
< |
s.release(); |
622 |
> |
s.release(2); |
623 |
|
s.acquire(); |
624 |
|
} catch(InterruptedException ie){ |
625 |
|
threadUnexpectedException(); |
629 |
|
try { |
630 |
|
t.start(); |
631 |
|
Thread.sleep(SHORT_DELAY_MS); |
632 |
< |
s.release(); |
633 |
< |
s.release(); |
634 |
< |
s.acquire(); |
635 |
< |
s.acquire(); |
636 |
< |
s.release(); |
632 |
> |
s.release(2); |
633 |
> |
s.acquire(2); |
634 |
> |
s.release(1); |
635 |
> |
t.join(); |
636 |
> |
} catch( InterruptedException e){ |
637 |
> |
unexpectedException(); |
638 |
> |
} |
639 |
> |
} |
640 |
> |
|
641 |
> |
/** |
642 |
> |
* release(n) in one thread enables acquire(n) in another thread |
643 |
> |
*/ |
644 |
> |
public void testAcquireReleaseNInDifferentThreads_fair2() { |
645 |
> |
final Semaphore s = new Semaphore(0, true); |
646 |
> |
Thread t = new Thread(new Runnable() { |
647 |
> |
public void run() { |
648 |
> |
try { |
649 |
> |
s.acquire(2); |
650 |
> |
s.acquire(2); |
651 |
> |
s.release(4); |
652 |
> |
} catch(InterruptedException ie){ |
653 |
> |
threadUnexpectedException(); |
654 |
> |
} |
655 |
> |
} |
656 |
> |
}); |
657 |
> |
try { |
658 |
> |
t.start(); |
659 |
> |
Thread.sleep(SHORT_DELAY_MS); |
660 |
> |
s.release(6); |
661 |
> |
s.acquire(2); |
662 |
> |
s.acquire(2); |
663 |
> |
s.release(2); |
664 |
|
t.join(); |
665 |
|
} catch( InterruptedException e){ |
666 |
|
unexpectedException(); |
669 |
|
|
670 |
|
|
671 |
|
|
672 |
+ |
|
673 |
+ |
|
674 |
|
/** |
675 |
|
* release in one thread enables timed acquire in another thread |
676 |
|
*/ |