 
                            ...
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 | Detectable | 
|---|
| Repairable | Priority | Level | 
|---|---|---|
| THI00-J | Low | 
| Probable | 
| Yes | 
| Yes | 
| P6 | 
| L2 | 
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 | ||||||
| Klocwork | 
 | JD.THREAD.RUN | |||||||
| 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
...