...
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(); } } |
...
THI00-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-EX0: Does not start a new thread } |
...
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
THI00-J | lowLow | probableProbable | mediumMedium | 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 |
---|---|---|---|
Coverity | 7.5 | DC.THREADING.thread_run | Implemented |
Related Guidelines
...
Android provides a couple of solutions for threading. The Android Developers Blog's article "Painless threadingThreading" discusses those solutions.
Bibliography
Interface |
...