RFR: 8364361: [process] java.lang.Process should implement Closeable [v11]

Jaikiran Pai jpai at openjdk.org
Sun Sep 28 13:25:16 UTC 2025


On Mon, 22 Sep 2025 22:25:59 GMT, Roger Riggs <rriggs at openjdk.org> wrote:

>> The teardown of a Process launched by `ProcessBuilder` includes the closing of streams and ensuring the termination of the process is the responsibility of the caller. The `Process.close()` method provides a clear and obvious way to ensure all the streams are closed and the process terminated.
>> 
>> The try-with-resources statement is frequently used to open streams and ensure they are closed on exiting the block. By implementing `AutoClosable.close()` the completeness of closing the streams and process termination can be done by try-with-resources.
>> 
>> The actions of the `close()` method are to close each stream and destroy the process if it has not terminated.
>
> Roger Riggs has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Update close() to use "terminate" consistently.

src/java.base/share/classes/java/lang/Process.java line 186:

> 184:      * <p>
> 185:      * Before calling this method the caller should read the streams for any
> 186:      * data or text and call {@linkplain #waitFor() waitFor} if the exit value is needed.

Should we add some additional text which clearly highlights that waitFor() needs to be called (before close()) to allow the process to run to completion, even when the exit value or the stream contents aren't used/read by the calling application? I realize that a few lines above we specify:

> The streams are closed immediately and the process is terminated without waiting.

But maybe explicitly saying that waitFor() is necessary for allowing the process to run to completion would help reduce confusion? When I first saw the PR, my initial thought was `Process.close()` would wait for the process to run to completion and cleanup the resources that were used and I suspect it might become a common pattern where applications do something like:


try (Process p = new ProcessBuilder("some process that takes 5 seconds to complete normally").start()) {
}

and be surprised that the launched process was abruptly terminated. So maybe some clear text on this method would help?

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/26649#discussion_r2385808375


More information about the core-libs-dev mailing list