/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
/* * This file is available under and governed by the GNU General Public * License version 2 only, as published by the Free Software Foundation. * However, the following notice accompanied the original version of this * file: * * Written by Doug Lea with assistance from members of JCP JSR-166 * Expert Group and released to the public domain, as explained at * http://creativecommons.org/publicdomain/zero/1.0/ * Other contributors include Andrew Wright, Jeffrey Hayes, * Pat Fisher, Mike Judd.
*/
/** * A new SingleThreadExecutor can execute runnables
*/ publicvoid testNewSingleThreadExecutor1() { final ExecutorService e = Executors.newSingleThreadExecutor(); try (PoolCleaner cleaner = cleaner(e)) {
e.execute(new NoOpRunnable());
e.execute(new NoOpRunnable());
e.execute(new NoOpRunnable());
}
}
/** * A new SingleThreadExecutor with given ThreadFactory can execute runnables
*/ publicvoid testNewSingleThreadExecutor2() { final ExecutorService e = Executors.newSingleThreadExecutor(new SimpleThreadFactory()); try (PoolCleaner cleaner = cleaner(e)) {
e.execute(new NoOpRunnable());
e.execute(new NoOpRunnable());
e.execute(new NoOpRunnable());
}
}
/** * A new SingleThreadExecutor with null ThreadFactory throws NPE
*/ publicvoid testNewSingleThreadExecutor3() { try {
ExecutorService unused = Executors.newSingleThreadExecutor(null);
shouldThrow();
} catch (NullPointerException success) {}
}
/** * A new SingleThreadExecutor cannot be casted to concrete implementation
*/ publicvoid testCastNewSingleThreadExecutor() { final ExecutorService e = Executors.newSingleThreadExecutor(); try (PoolCleaner cleaner = cleaner(e)) { try {
ThreadPoolExecutor tpe = (ThreadPoolExecutor)e;
shouldThrow();
} catch (ClassCastException success) {}
}
}
/** * A new newFixedThreadPool can execute runnables
*/ publicvoid testNewFixedThreadPool1() { final ExecutorService e = Executors.newFixedThreadPool(2); try (PoolCleaner cleaner = cleaner(e)) {
e.execute(new NoOpRunnable());
e.execute(new NoOpRunnable());
e.execute(new NoOpRunnable());
}
}
/** * A new newFixedThreadPool with given ThreadFactory can execute runnables
*/ publicvoid testNewFixedThreadPool2() { final ExecutorService e = Executors.newFixedThreadPool(2, new SimpleThreadFactory()); try (PoolCleaner cleaner = cleaner(e)) {
e.execute(new NoOpRunnable());
e.execute(new NoOpRunnable());
e.execute(new NoOpRunnable());
}
}
/** * A new newFixedThreadPool with null ThreadFactory throws * NullPointerException
*/ publicvoid testNewFixedThreadPool3() { try {
ExecutorService unused = Executors.newFixedThreadPool(2, null);
shouldThrow();
} catch (NullPointerException success) {}
}
/** * A new newFixedThreadPool with 0 threads throws IllegalArgumentException
*/ publicvoid testNewFixedThreadPool4() { try {
ExecutorService unused = Executors.newFixedThreadPool(0);
shouldThrow();
} catch (IllegalArgumentException success) {}
}
/** * An unconfigurable newFixedThreadPool can execute runnables
*/ publicvoid testUnconfigurableExecutorService() { final ExecutorService e = Executors.unconfigurableExecutorService(Executors.newFixedThreadPool(2)); try (PoolCleaner cleaner = cleaner(e)) {
e.execute(new NoOpRunnable());
e.execute(new NoOpRunnable());
e.execute(new NoOpRunnable());
}
}
/** * a newSingleThreadScheduledExecutor successfully runs delayed task
*/ publicvoid testNewSingleThreadScheduledExecutor() throws Exception { final ScheduledExecutorService p = Executors.newSingleThreadScheduledExecutor(); try (PoolCleaner cleaner = cleaner(p)) { final CountDownLatch proceed = new CountDownLatch(1); final Runnable task = new CheckedRunnable() { publicvoid realRun() {
await(proceed);
}}; long startTime = System.nanoTime();
Future<?> f = p.schedule(Executors.callable(task, Boolean.TRUE),
timeoutMillis(), MILLISECONDS);
assertFalse(f.isDone());
proceed.countDown();
assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
assertSame(Boolean.TRUE, f.get());
assertTrue(f.isDone());
assertFalse(f.isCancelled());
assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
}
}
/** * a newScheduledThreadPool successfully runs delayed task
*/ publicvoid testNewScheduledThreadPool() throws Exception { final ScheduledExecutorService p = Executors.newScheduledThreadPool(2); try (PoolCleaner cleaner = cleaner(p)) { final CountDownLatch proceed = new CountDownLatch(1); final Runnable task = new CheckedRunnable() { publicvoid realRun() {
await(proceed);
}}; long startTime = System.nanoTime();
Future<?> f = p.schedule(Executors.callable(task, Boolean.TRUE),
timeoutMillis(), MILLISECONDS);
assertFalse(f.isDone());
proceed.countDown();
assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
assertSame(Boolean.TRUE, f.get());
assertTrue(f.isDone());
assertFalse(f.isCancelled());
assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
}
}
/** * an unconfigurable newScheduledThreadPool successfully runs delayed task
*/ publicvoid testUnconfigurableScheduledExecutorService() throws Exception { final ScheduledExecutorService p =
Executors.unconfigurableScheduledExecutorService
(Executors.newScheduledThreadPool(2)); try (PoolCleaner cleaner = cleaner(p)) { final CountDownLatch proceed = new CountDownLatch(1); final Runnable task = new CheckedRunnable() { publicvoid realRun() {
await(proceed);
}}; long startTime = System.nanoTime();
Future<?> f = p.schedule(Executors.callable(task, Boolean.TRUE),
timeoutMillis(), MILLISECONDS);
assertFalse(f.isDone());
proceed.countDown();
assertSame(Boolean.TRUE, f.get(LONG_DELAY_MS, MILLISECONDS));
assertSame(Boolean.TRUE, f.get());
assertTrue(f.isDone());
assertFalse(f.isCancelled());
assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
}
}
/** * Future.get on submitted tasks will time out if they compute too long.
*/ publicvoid testTimedCallable() throws Exception { final ExecutorService[] executors = {
Executors.newSingleThreadExecutor(),
Executors.newCachedThreadPool(),
Executors.newFixedThreadPool(2),
Executors.newScheduledThreadPool(2),
};
final CountDownLatch done = new CountDownLatch(1);
final Runnable sleeper = new CheckedRunnable() { publicvoid realRun() throws InterruptedException {
done.await(LONG_DELAY_MS, MILLISECONDS);
}};
List<Thread> threads = new ArrayList<>(); for (final ExecutorService executor : executors) {
threads.add(newStartedThread(new CheckedRunnable() { publicvoid realRun() {
Future<?> future = executor.submit(sleeper);
assertFutureTimesOut(future);
}}));
} for (Threadthread : threads)
awaitTermination(thread);
done.countDown(); for (ExecutorService executor : executors)
joinPool(executor);
}
/** * ThreadPoolExecutor using defaultThreadFactory has * specified group, priority, daemon status, and name
*/
@SuppressWarnings("removal") publicvoid testDefaultThreadFactory() throws Exception { final ThreadGroup egroup = Thread.currentThread().getThreadGroup(); final CountDownLatch done = new CountDownLatch(1);
Runnable r = new CheckedRunnable() { publicvoid realRun() { try { Thread current = Thread.currentThread();
assertFalse(current.isDaemon());
assertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
SecurityManager s = System.getSecurityManager();
assertSame(current.getThreadGroup(),
(s == null) ? egroup : s.getThreadGroup());
assertTrue(current.getName().endsWith("thread-1"));
} catch (SecurityException ok) { // Also pass if not allowed to change setting
}
done.countDown();
}};
ExecutorService e = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory()); try (PoolCleaner cleaner = cleaner(e)) {
e.execute(r);
await(done);
}
}
/** * ThreadPoolExecutor using privilegedThreadFactory has * specified group, priority, daemon status, name, * access control context and context class loader
*/
@SuppressWarnings("removal") publicvoid testPrivilegedThreadFactory() throws Exception { final CountDownLatch done = new CountDownLatch(1);
Runnable r = new CheckedRunnable() { publicvoid realRun() throws Exception { final ThreadGroup egroup = Thread.currentThread().getThreadGroup(); final ClassLoader thisccl = Thread.currentThread().getContextClassLoader(); final AccessControlContext thisacc = AccessController.getContext();
Runnable r = new CheckedRunnable() { publicvoid realRun() { Thread current = Thread.currentThread();
assertFalse(current.isDaemon());
assertTrue(current.getPriority() <= Thread.NORM_PRIORITY);
SecurityManager s = System.getSecurityManager();
assertSame(current.getThreadGroup(),
(s == null) ? egroup : s.getThreadGroup());
assertTrue(current.getName().endsWith("thread-1"));
assertSame(thisccl, current.getContextClassLoader());
assertEquals(thisacc, AccessController.getContext());
done.countDown();
}};
ExecutorService e = Executors.newSingleThreadExecutor(Executors.privilegedThreadFactory()); try (PoolCleaner cleaner = cleaner(e)) {
e.execute(r);
await(done);
}
}};
runWithPermissions(r, new RuntimePermission("getClassLoader"), new RuntimePermission("setContextClassLoader"), new RuntimePermission("modifyThread"));
}
// It seems rather difficult to test that the // AccessControlContext of the privilegedCallable is used // instead of its caller. Below is a failed attempt to do // that, which does not work because the AccessController // cannot capture the internal state of the current Policy. // It would be much more work to differentiate based on, // e.g. CodeSource.
// final AccessControlContext[] noprivAcc = new AccessControlContext[1]; // final Callable[] task = new Callable[1];
/** * With permissions, calling privilegedCallable succeeds
*/
@SuppressWarnings("removal") publicvoid testPrivilegedCallableWithPrivs() throws Exception {
Runnable r = new CheckedRunnable() { publicvoid realRun() throws Exception {
Executors.privilegedCallable(new CheckCCL()).call();
}};
runWithPermissions(r, new RuntimePermission("getClassLoader"), new RuntimePermission("setContextClassLoader"));
}
/** * callable(Runnable) returns null when called
*/ publicvoid testCallable1() throws Exception {
Callable<?> c = Executors.callable(new NoOpRunnable());
assertNull(c.call());
}
/** * callable(Runnable, result) returns result when called
*/ publicvoid testCallable2() throws Exception {
Callable<?> c = Executors.callable(new NoOpRunnable(), one);
assertSame(one, c.call());
}
/** * callable(PrivilegedAction) returns its result when called
*/ publicvoid testCallable3() throws Exception {
Callable<?> c = Executors.callable(new PrivilegedAction() { public Object run() { return one; }});
assertSame(one, c.call());
}
/** * callable(PrivilegedExceptionAction) returns its result when called
*/ publicvoid testCallable4() throws Exception {
Callable<?> c = Executors.callable(new PrivilegedExceptionAction() { public Object run() { return one; }});
assertSame(one, c.call());
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.