Summary
Degrade Thread.stop() to throw UnsupportedOperationException (UOE) unconditionally. Deprecate the error ThreadDeath, for removal.
Problem
Thread.stop dates from JDK 1.0 as an API to "stop" a victim thread by causing the victim thread to throw the error ThreadDeath. It is inherently unsafe with all "stop" methods deprecated since JDK 1.2 with a link to the "Java Thread Primitive Deprecation" page that explains the reasoning for the deprecation.
The recent steps on degrading and removing the feature are:
-
Thread.stop(Throwable) was degraded to throw UOE in Java 8 and removed in Java 11.
-
ThreadGroup.stop() was degraded to throw UOE in Java 19.
The remaining method is the no-arg Thread.stop(). This method is terminally deprecated since Java 18. In Java 19 it was specified to throw UOE when invoked on a virtual Thread.
Solution
-
Degrade the no-arg Thread.stop to throw UOE.
-
Deprecate ThreadDeath, for removal.
-
Update the specification of ThreadGroup.uncaughtException to remove its special handling for ThreadDeath.
-
Remove the target permission name "stopThread" from the table of names in java.lang.RuntimePermission.
The solution has no impact on the debugger APIs (JVM TI StopThread, JDWP ThreadReference/Stop, and JDI ThreadReference.stop). The debugger APIs can still be used to send an asynchronous exception as before.
Specification
A zip file with the specdiffs is attached to this CSR.
Asynchronous exceptions are described in JLS 11.1.3 and JVMS 2.10. A separate issue tracks the updates to the JLS and JVMS.
- csr of
-
JDK-8289610 Degrade Thread.stop
-
- Resolved
-
- relates to
-
JDK-8293975 Degrade Thread.suspend and Thread.resume
-
- Closed
-