...
This noncompliant code example explicitly invokes run()
in the context of the current thread.:
Code Block | ||
---|---|---|
| ||
public final class Foo implements Runnable {
@Override public void run() {
// ...
}
public static void main(String[] args) {
Foo foo = new Foo();
new Thread(foo).run();
}
}
|
...
This compliant solution correctly uses the start()
method to tell the Java runtimes runtime to start a new thread.:
Code Block | ||
---|---|---|
| ||
public final class Foo implements Runnable {
@Override public void run() {
// ...
}
public static void main(String[] args) {
Foo foo = new Foo();
new Thread(foo).start();
}
}
|
Exceptions
THI00-J-EX0: The run()
method may be directly invoked during unit testing. Note that this method cannot be used to test a class for multithreaded use.
Given a Thread
object that has been was constructed with a runnable argument, when invoking the Thread.run()
method, the Thread
object may be cast to Runnable
to eliminate analyzer diagnostics.:
Code Block | ||
---|---|---|
| ||
public void sampleRunTest() { Thread thread = new Thread(new Runnable() { @Override public void run() { // ... } }); ((Runnable) thread).run(); // THI00-J-EX0: Does not start a new thread } |
Casting a thread to Runnable
before calling the run()
method documents that the explicit call to Thread.run()
is intentional. Adding an explanatory comment alongside the invocation is highly recommended.
THI00-J-EX1: Runtime system code involved in starting new threads is permitted to invoke a Thread
object's run()
method directly; this is an obvious necessity for a working Java runtime system. Note that the likelihood that this exception applies to user-written code is vanishingly small.
...
Failure to start threads correctly can cause unexpected behavior.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
THI00-J |
Low |
Probable |
Medium | P4 | L3 |
Automated Detection
Automated detection of direct invocations of Thread.run()
methods is straightforward. Sound automated determination of which specific invocations are permitted may be infeasible. Heuristic approaches may be useful.
Tool | Version | Checker | Description | ||||||
---|---|---|---|---|---|---|---|---|---|
CodeSonar |
| JAVA.CONCURRENCY.LOCK.SCTB | Synchronous Call to Thread Body (Java) | ||||||
Coverity | 7.5 | DC.THREADING.thread_run | Implemented | ||||||
Parasoft Jtest |
| CERT.THI00.IRUN | Do not call the 'run()' method directly on classes extending 'java.lang.Thread' or implementing 'java.lang.Runnable' | ||||||
PVS-Studio |
| V6064 | |||||||
SonarQube |
| S1217 | Thread.run() should not be called directly |
Related Guidelines
Android Implementation Details
Android provides a couple of solutions for threading. The Android Developers Blog's article "Painless Threading" discusses those solutions.
Bibliography
...