test/jdk/java/util/concurrent/ThreadPoolExecutor/ThreadRestarts.java
changeset 47216 71c04702a3d5
parent 40817 4f5fb115676d
child 51754 594919232b8f
equal deleted inserted replaced
47215:4ebc2e2fb97c 47216:71c04702a3d5
       
     1 /*
       
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     3  *
       
     4  * This code is free software; you can redistribute it and/or modify it
       
     5  * under the terms of the GNU General Public License version 2 only, as
       
     6  * published by the Free Software Foundation.
       
     7  *
       
     8  * This code is distributed in the hope that it will be useful, but WITHOUT
       
     9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    11  * version 2 for more details (a copy is included in the LICENSE file that
       
    12  * accompanied this code).
       
    13  *
       
    14  * You should have received a copy of the GNU General Public License version
       
    15  * 2 along with this work; if not, write to the Free Software Foundation,
       
    16  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    17  *
       
    18  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    19  * or visit www.oracle.com if you need additional information or have any
       
    20  * questions.
       
    21  */
       
    22 
       
    23 /*
       
    24  * This file is available under and governed by the GNU General Public
       
    25  * License version 2 only, as published by the Free Software Foundation.
       
    26  * However, the following notice accompanied the original version of this
       
    27  * file:
       
    28  *
       
    29  * Written by Martin Buchholz and Jason Mehrens with assistance from
       
    30  * members of JCP JSR-166 Expert Group and released to the public
       
    31  * domain, as explained at
       
    32  * http://creativecommons.org/publicdomain/zero/1.0/
       
    33  */
       
    34 
       
    35 /*
       
    36  * @test
       
    37  * @summary Only one thread should be created when a thread needs to
       
    38  * be kept alive to service a delayed task waiting in the queue.
       
    39  * @library /lib/testlibrary/
       
    40  */
       
    41 
       
    42 import static java.util.concurrent.TimeUnit.MILLISECONDS;
       
    43 
       
    44 import java.util.concurrent.ScheduledThreadPoolExecutor;
       
    45 import java.util.concurrent.ThreadFactory;
       
    46 import java.util.concurrent.atomic.AtomicLong;
       
    47 import jdk.testlibrary.Utils;
       
    48 
       
    49 public class ThreadRestarts {
       
    50     static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000);
       
    51     static final long FAR_FUTURE_MS = 10 * LONG_DELAY_MS;
       
    52 
       
    53     public static void main(String[] args) throws Exception {
       
    54         test(false);
       
    55         test(true);
       
    56     }
       
    57 
       
    58     private static void test(boolean allowTimeout) throws Exception {
       
    59         CountingThreadFactory ctf = new CountingThreadFactory();
       
    60         ScheduledThreadPoolExecutor stpe
       
    61             = new ScheduledThreadPoolExecutor(10, ctf);
       
    62         try {
       
    63             // schedule a dummy task in the "far future"
       
    64             Runnable nop = new Runnable() { public void run() {}};
       
    65             stpe.schedule(nop, FAR_FUTURE_MS, MILLISECONDS);
       
    66             stpe.setKeepAliveTime(1L, MILLISECONDS);
       
    67             stpe.allowCoreThreadTimeOut(allowTimeout);
       
    68             MILLISECONDS.sleep(12L);
       
    69         } finally {
       
    70             stpe.shutdownNow();
       
    71             if (!stpe.awaitTermination(LONG_DELAY_MS, MILLISECONDS))
       
    72                 throw new AssertionError("timed out");
       
    73         }
       
    74         if (ctf.count.get() > 1)
       
    75             throw new AssertionError(
       
    76                 String.format("%d threads created, 1 expected",
       
    77                               ctf.count.get()));
       
    78     }
       
    79 
       
    80     static class CountingThreadFactory implements ThreadFactory {
       
    81         final AtomicLong count = new AtomicLong(0L);
       
    82 
       
    83         public Thread newThread(Runnable r) {
       
    84             count.getAndIncrement();
       
    85             Thread t = new Thread(r);
       
    86             t.setDaemon(true);
       
    87             return t;
       
    88         }
       
    89     }
       
    90 }