Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

It

...

is

...

critical

...

to

...

ensure

...

that

...

threads

...

are

...

started

...

correctly.

...

Thread

...

start-up

...

can

...

be

...

misleading

...

because

...

sometimes

...

the

...

code

...

appears

...

to

...

be

...

performing

...

the

...

function

...

correctly,

...

when

...

it is actually executing in the wrong thread.

The Thread.start()

...

method

...

starts

...

executing

...

a

...

thread's

...

run()

...

method

...

in

...

the

...

respective

...

thread.

...

It

...

is

...

a

...

mistake

...

to

...

directly

...

invoke

...

the

...

run()

...

method

...

on

...

a

...

Thread

...

object.

...

When

...

invoked

...

directly,

...

the

...

statements

...

in

...

the

...

run()

...

method

...

execute

...

in

...

the

...

current

...

thread

...

instead

...

of

...

the

...

newly

...

created

...

thread.

...

Furthermore,

...

if

...

the

...

Thread

...

object

...

is

...

not

...

constructed

...

from

...

a

...

Runnable

...

object

...

but

...

rather

...

by

...

instantiating

...

a

...

subclass

...

of

...

Thread

...

that

...

does

...

not

...

override

...

the

...

run()

...

method,

...

a

...

call

...

to

...

the

...

subclass's

...

run()

...

method

...

invokes

...

Thread.run()

...

, which

...

does nothing.

Noncompliant Code Example

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

Code Block
bgColor#FFCCCC
 nothing. {mc} can we rephrase "does nothing," for e.g. "method invokes {{Thread.run()}} which has an empty run() method"? {mc}


h2. Noncompliant Code Example

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

{code:bgColor=#FFCCCC}
public final class Foo implements Runnable {
  public void run() {
    // ...
  }

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

The {{

The start()

...

method

...

is

...

not

...

invoked

...

on

...

the

...

new

...

thread

...

because

...

of

...

the

...

incorrect

...

assumption

...

that

...

run()

...

starts

...

the

...

new

...

thread.

...

Consequently,

...

the

...

statements

...

in

...

the

...

run()

...

method

...

execute

...

in

...

the

...

same

...

thread

...

instead

...

of

...

the

...

new

...

one.

...

Compliant

...

Solution

...

This

...

compliant

...

solution

...

correctly

...

uses

...

the

...

start()

...

method

...

to

...

start

...

a

...

new

...

thread.

...

Then, that method internally invokes the run()

...

method

...

in

...

the

...

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();
  }
}
{code}

h2. Exceptions

*EX1:* The {{

Exceptions

THI02-EX1: The run()

...

method

...

may

...

be

...

invoked

...

when

...

unit

...

testing

...

functionality.

...

Note

...

that

...

this

...

method

...

cannot

...

be

...

used

...

to

...

test

...

a

...

class

...

for

...

multithreaded

...

use.

...

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
}
Thread thread = new Thread(new Runnable() {
    public void run() {
      // ...
    }
  });

((Runnable) thread).run();  // Exception: This does not start a new thread
{code}

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.

...

Risk Assessment

Failing to start threads correctly can cause unexpected behavior.

Guideline

Severity

Likelihood

Remediation Cost

Priority

Level

THI02- J

low

probable

medium

P4

L3

References

Wiki Markup
\[[API 2006|AA. Java References#API 06]\] Interface 

...

Runnable

...

 and class {{Thread}}

...

...

Image Added      12. Locking (LCK)      Image Added