24 |
|
import java.util.concurrent.ScheduledFuture; |
25 |
|
import java.util.concurrent.ScheduledThreadPoolExecutor; |
26 |
|
import java.util.concurrent.ThreadFactory; |
27 |
+ |
import java.util.concurrent.ThreadLocalRandom; |
28 |
|
import java.util.concurrent.ThreadPoolExecutor; |
29 |
|
import java.util.concurrent.atomic.AtomicBoolean; |
30 |
|
import java.util.concurrent.atomic.AtomicInteger; |
745 |
|
* - setContinueExistingPeriodicTasksAfterShutdownPolicy |
746 |
|
*/ |
747 |
|
public void testShutdown_cancellation() throws Exception { |
747 |
– |
final int UNSPECIFIED = 0, YES = 1, NO = 2; |
748 |
– |
for (int maybe : new int[] { UNSPECIFIED, YES, NO }) |
749 |
– |
{ |
748 |
|
final int poolSize = 2; |
749 |
|
final ScheduledThreadPoolExecutor p |
750 |
|
= new ScheduledThreadPoolExecutor(poolSize); |
751 |
< |
final boolean effectiveDelayedPolicy = (maybe != NO); |
752 |
< |
final boolean effectivePeriodicPolicy = (maybe == YES); |
753 |
< |
final boolean effectiveRemovePolicy = (maybe == YES); |
754 |
< |
if (maybe != UNSPECIFIED) { |
755 |
< |
p.setExecuteExistingDelayedTasksAfterShutdownPolicy(maybe == YES); |
756 |
< |
p.setContinueExistingPeriodicTasksAfterShutdownPolicy(maybe == YES); |
757 |
< |
p.setRemoveOnCancelPolicy(maybe == YES); |
758 |
< |
} |
751 |
> |
final ThreadLocalRandom rnd = ThreadLocalRandom.current(); |
752 |
> |
final boolean effectiveDelayedPolicy; |
753 |
> |
final boolean effectivePeriodicPolicy; |
754 |
> |
final boolean effectiveRemovePolicy; |
755 |
> |
|
756 |
> |
if (rnd.nextBoolean()) |
757 |
> |
p.setExecuteExistingDelayedTasksAfterShutdownPolicy( |
758 |
> |
effectiveDelayedPolicy = rnd.nextBoolean()); |
759 |
> |
else |
760 |
> |
effectiveDelayedPolicy = true; |
761 |
|
assertEquals(effectiveDelayedPolicy, |
762 |
|
p.getExecuteExistingDelayedTasksAfterShutdownPolicy()); |
763 |
+ |
|
764 |
+ |
if (rnd.nextBoolean()) |
765 |
+ |
p.setContinueExistingPeriodicTasksAfterShutdownPolicy( |
766 |
+ |
effectivePeriodicPolicy = rnd.nextBoolean()); |
767 |
+ |
else |
768 |
+ |
effectivePeriodicPolicy = false; |
769 |
|
assertEquals(effectivePeriodicPolicy, |
770 |
|
p.getContinueExistingPeriodicTasksAfterShutdownPolicy()); |
771 |
+ |
|
772 |
+ |
if (rnd.nextBoolean()) |
773 |
+ |
p.setRemoveOnCancelPolicy( |
774 |
+ |
effectiveRemovePolicy = rnd.nextBoolean()); |
775 |
+ |
else |
776 |
+ |
effectiveRemovePolicy = false; |
777 |
|
assertEquals(effectiveRemovePolicy, |
778 |
|
p.getRemoveOnCancelPolicy()); |
779 |
+ |
|
780 |
|
// Strategy: Wedge the pool with poolSize "blocker" threads |
781 |
|
final AtomicInteger ran = new AtomicInteger(0); |
782 |
|
final CountDownLatch poolBlocked = new CountDownLatch(poolSize); |
847 |
|
for (Future<?> future : blockers) |
848 |
|
assertNull(future.get()); |
849 |
|
assertEquals(2 + (effectiveDelayedPolicy ? 1 : 0), ran.get()); |
850 |
< |
}} |
850 |
> |
} |
851 |
|
|
852 |
|
/** |
853 |
|
* completed submit of callable returns result |