This rule raises an issue when `Thread.run()` is called instead of `Thread.start()`.

== Why is this an issue?

The likely intention of a user calling `Thread.run()` is to start the execution of code within a new thread.
This, however, is not what happens when this method is called.

The purpose of `Thread.run()` is to provide a method that users can overwrite to specify the code to be executed.
The actual thread is then started by calling `Thread.start()`.
When `Thread.run()` is called directly, it will be executed as a regular method within the current thread.

== How to fix it

If you intend to execute the contents of the `Thread.run()` method within a new thread,
call `Thread.start()` instead.

If your intention is only to have a container for a method but execute this method within the current thread,
do not use `Thread` but `Runnable` or another functional interface.

=== Code examples

==== Noncompliant code example

[source,java,diff-id=1,diff-type=noncompliant]
----
Thread myThread = new Thread(runnable);
myThread.run(); // Noncompliant, does not start a thread
----

==== Compliant solution

[source,java,diff-id=1,diff-type=compliant]
----
Thread myThread = new Thread(runnable);
myThread.start(); // Compliant
----

==== Noncompliant code example

[source,java,diff-id=2,diff-type=noncompliant]
----
class ComputePrimesThread extends Thread {
    @Override
    public void run() {
        // ...
    }
}
new ComputePrimesThread().run(); // Noncompliant, does not start a thread
----

==== Compliant solution

[source,java,diff-id=2,diff-type=compliant]
----
class ComputePrimesThread extends Thread {
    @Override
    public void run() {
        // ...
    }
}
new ComputePrimesThread().start(); // Compliant
----

==== Noncompliant code example

[source,java,diff-id=3,diff-type=noncompliant]
----
class Button {

    private Thread onClick;

    Button(Thread onClick) {
        this.onClick = onClick;
    }

    private void clicked() {
        if (onClick != null) onClick.run(); // Noncompliant, use functional interface
    }
}

new Button(new Thread() {
    @Override public void run() {
        System.out.println("clicked!");
    }
});
----

==== Compliant solution

[source,java,diff-id=3,diff-type=compliant]
----
class Button {

    private Runnable onClick;

    Button(Runnable onClick) {
        this.onClick = onClick;
    }

    private void clicked() {
        if (onClick != null) onClick.run(); // compliant
    }
}

new Button(() -> System.out.println("clicked!"));
----

== Resources

=== Documentation

* https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#start--[Java™ Platform, Standard Edition 8 API Specification - Thread.start()]

=== Articles & blog posts

* https://www.javatpoint.com/what-if-we-call-java-run-method-directly[JavaTPoint - What if we call Java run() method directly instead start() method?]

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

Call the method Thread.start() to execute the content of the run() method in a dedicated thread.


'''
== Comments And Links
(visible only on this page)

=== on 20 Aug 2013, 15:40:32 Freddy Mallet wrote:
Is implemented by \http://jira.codehaus.org/browse/SONARJAVA-308

endif::env-github,rspecator-view[]
