Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Added an Android Implementation Details section

...

This noncompliant code example explicitly invokes run() in the context of the current thread.

Code Block
bgColor#FFCCCC

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 to start a new thread.

Code Block
bgColor#ccccff

public final class Foo implements Runnable {
  @Override public void run() {
    // ...
  }

  public static void main(String[] args) {
    Foo foo = new Foo();
    new Thread(foo).start();
  }
}

...

Given a Thread object that has been 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
bgColor#ccccff

public void sampleRunTest() {

  Thread thread = new Thread(new Runnable() {
      @Override public void run() {
        // ...
      }
    });
  
  ((Runnable) thread).run();  // THI00-EX0: Does not start a new thread

}

...

MITRE CWE

CWE-572. Call to Thread run() instead of start()

Android Implementation Details

Android provides a couple of solutions for threading. The Android Developers Blog's article "Painless threading" discusses those solutions.

Bibliography

[API 2006]

Interface Runnable and class Thread

 

09. Thread APIs (THI)      09. Thread APIs (THI)