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 Doug Lea with assistance from members of JCP JSR-166 30 * Expert Group and released to the public domain, as explained at 31 * http://creativecommons.org/publicdomain/zero/1.0/ 32 */ 33 34 /* 35 * @test 36 * @bug 8008378 37 * @run main/othervm -Djava.util.concurrent.ForkJoinPool.common.exceptionHandler=ThrowingRunnable 38 * ThrowingRunnable 39 * @summary FJP.execute(Runnable), uncaught exception should cause worker thread 40 * to die. 41 * @author Chris Hegarty 42 */ 43 44 import java.lang.Thread.UncaughtExceptionHandler; 45 import java.util.concurrent.ForkJoinPool; 46 import java.util.concurrent.Phaser; 47 import java.util.concurrent.TimeUnit; 48 49 public class ThrowingRunnable implements Runnable, UncaughtExceptionHandler { 50 51 static final Phaser phaser = new Phaser(2); 52 53 private static void realMain(String[] args) throws Throwable { 54 ThrowingRunnable r = new ThrowingRunnable(); 55 ForkJoinPool.commonPool().execute(r); 56 phaser.awaitAdvanceInterruptibly(phaser.arrive(), 10, TimeUnit.SECONDS); 57 pass(); 58 } 59 60 @Override 61 public void run() { 62 throw new RuntimeException("This is an exception."); 63 } 64 65 @Override 66 public void uncaughtException(Thread t, Throwable e) { 67 pass(); 68 phaser.arrive(); 69 } 70 71 //--------------------- Infrastructure --------------------------- 72 static volatile int passed = 0, failed = 0; 73 static void pass() {passed++;} 74 static void fail() {failed++; /*Thread.dumpStack();*/} 75 static void fail(String msg) {System.out.println(msg); fail();} 76 static void unexpected(Throwable t) {failed++; t.printStackTrace();} 77 static void check(boolean cond, String msg) {if (cond) pass(); else fail(msg);} 78 static void equal(Object x, Object y) { 79 if (x == null ? y == null : x.equals(y)) pass(); 80 else fail(x + " not equal to " + y);} 81 public static void main(String[] args) throws Throwable { 82 try {realMain(args);} catch (Throwable t) {unexpected(t);} 83 System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); 84 if (failed > 0) throw new AssertionError("Some tests failed");} 85 }