...
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 | ||
---|---|---|
| ||
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 | ||||
---|---|---|---|---|
| =
| |||
} 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 | ||||
---|---|---|---|---|
| =
| |||
} 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}} |
...
...