jtreg main/othervm "completes" even when there's a non-daemon thread currently active?

Jaikiran Pai jai.forums2013 at gmail.com
Mon Mar 8 16:51:37 UTC 2021


Please consider this trivial Java program:

public class FooTest {
     public static void main(final String[] args) throws Exception {
         Thread t = new Thread(new Task());
         t.setName("Thread-A");
         t.start();
         System.out.println("Main done");
     }

     public static class Task implements Runnable {
         @Override
         public void run() {
             // wait forever
             System.out.println("Initiating a wait");
             try {
                 new java.util.concurrent.CountDownLatch(1).await();
             } catch (Throwable t) {
                 t.printStackTrace();
             }
         }
     }
}


All it does is launches a (non-daemon) thread and the thread just waits 
(forever). When you run this as a normal Java program, as expected it 
waits forever, even after the "main" thread is completed, due to the 
other non-daemon thread.

Now let's consider the exact same program converted into a jtreg, by 
adding just the javadoc annotations:


/**
  * @test
  * @summary Test jtreg
  * @run main/othervm FooTest
  */
public class FooTest {
     public static void main(final String[] args) throws Exception {
         Thread t = new Thread(new Task());
         t.setName("Thread-A");
         t.start();
         System.out.println("Main done");
     }

     public static class Task implements Runnable {
         @Override
         public void run() {
             // wait forever
             System.out.println("Initiating a wait");
             try {
                 new java.util.concurrent.CountDownLatch(1).await();
             } catch (Throwable t) {
                 t.printStackTrace();
             }
         }
     }
}

(no change to the code, just the jtreg annotations/markers have been added).


Now run this from within the JDK testsuite (for example), using jtreg:

jtreg -jdk:build/macosx-x86_64-server-release/images/jdk 
test/jdk/java/lang/FooTest.java

This "passes" (immediately). i.e. the jtreg launched program/test 
doesn't wait for the non-daemon thread to complete and instead just 
exits successfully when the main thread is done. I have verified the 
logs to make sure it indeed exits cleanly without errors or timeouts and 
does the run the code in that test.

Is this expected? I haven't found this mentioned in the user guide (as 
far as I can see) and a quick glance in the jtreg source code (the 
MainWrapper specifically) doesn't tell me how this change in behaviour 
of the JVM exit semantics would be possible (since it ultimately uses 
ProcessBuilder to launch the program).

-Jaikiran





More information about the jtreg-use mailing list