diff --git a/rules/S6901/java/metadata.json b/rules/S6901/java/metadata.json new file mode 100644 index 00000000000..25f6b10b20e --- /dev/null +++ b/rules/S6901/java/metadata.json @@ -0,0 +1,24 @@ +{ + "title": "\"setDaemon\", \"setPriority\" and \"getThreadGroup\" should not be invoked on virtual threads", + "type": "BUG", + "status": "ready", + "remediation": { + "func": "Constant\/Issue", + "constantCost": "5min" + }, + "tags": [ + "java21", "bug" + ], + "defaultSeverity": "Major", + "ruleSpecification": "RSPEC-6901", + "sqKey": "S6901", + "scope": "All", + "defaultQualityProfiles": ["Sonar way"], + "quickfix": "unknown", + "code": { + "impacts": { + "RELIABILITY": "MEDIUM" + }, + "attribute": "CONVENTIONAL" + } +} diff --git a/rules/S6901/java/rule.adoc b/rules/S6901/java/rule.adoc new file mode 100644 index 00000000000..66ff189fdfe --- /dev/null +++ b/rules/S6901/java/rule.adoc @@ -0,0 +1,36 @@ +== Why is this an issue? + +The `Thread` class has some methods that are used to monitor and manage its execution. +With the introduction of virtual threads in Java 21, there are three of these methods that behave differently +between the standard platform threads and the virtual ones. + +For virtual threads: + +* `Thread.setDaemon(boolean)` will throw an `IllegalArgumentException` if `false` is passed as an argument as a virtual thread daemon status is always true. +* `Thread.setPriority(int priority)` will never change the actual priority of a virtual thread, which is always equal to `Thread.NORM_PRIORITY` +* `Thread.getThreadGroup()` will return a dummy "VirtualThreads" group that is empty and should not be used + +This rule reports an issue when one of these methods is invoked on a virtual thread. + +=== Code examples + +==== Noncompliant code example + +[source,java] +---- +Thread t = Thread.ofVirtual().unstarted(()->{/* some task */}); +t.setPriority(1); // Noncompliant; virtual threads' priority cannot be changed +t.setDaemon(false); // Noncompliant; will throw IllegalArgumentException +t.setDaemon(true); // Noncompliant; redundant +t.start(); +var threadGroup = t.getThreadGroup(); // Noncompliant; virtual thread groups should not be used +---- + +== Resources + +=== Documentation + +* Java Documentation - https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Thread.html#setDaemon(boolean)[Thread.setDaemon] +* Java Documentation - https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Thread.html#setPriority(int)[Thread.setPriority] +* Java Documentation - https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Thread.html#getThreadGroup()[Thread.getThreadGroup] +* Java Documentation - https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/ThreadGroup.html#virtualthreadgroup[Virtual threads group] diff --git a/rules/S6901/metadata.json b/rules/S6901/metadata.json new file mode 100644 index 00000000000..2c63c085104 --- /dev/null +++ b/rules/S6901/metadata.json @@ -0,0 +1,2 @@ +{ +}