Channels ▼

JVM Languages

Multithreading, Java, & OSGi

Source Code Accompanies This Article. Download It Now.

Interrupt Me Before I Run Again

Working with multiple threads is, in a way, like writing transactional database code—you need to think carefully about which operations have to be atomic to preserve the system, yet being too conservative in this regard can make your code inefficient. This shouldn't come as a surprise, as a database is typically handling multiple requests from multiple clients in parallel. If you look at ThreadManager as a miniscule database, the same conditions apply: run() and stopAll() can be called in parallel. What guarantees should be made?

In my prototype application, one worker thread is spawned periodically based on external events, runs for a few hundred milliseconds, and then exits. (Because it takes little time to complete and doesn't block, I even used a null interrupt() method.) Creation of this thread was independent of when my bundle might be stopped; in fact, the two always occurred on different threads. The guarantees wanted as a client of ThreadManager are:

  • If a call to run() succeeds, then that Interruptible will be stopped by a (possibly simultaneous) call to stopAll().
  • If stopAll() is called, no later calls to run() on that ThreadManager succeed.

Together, these rules guarantee the necessary transactionality, and thus synchronization, between creating and stopping threads using the same ThreadManager instance. Without them, race conditions could permit new threads created at the same time as stopAll() to continue running after stopAll() returns.

These guarantees are implemented with a Boolean object in ThreadManager, isStopping, that tracks whether a call to stopAll() has started. Once set, subsequent calls to run() fail. It is important that synchronization is performed on this variable and that run() and stopAll() are not themselves synchronized. If they were, calls to run() would block while stopAll() was executing. Because stopAll() could be stopping a thread calling run(), deadlock could result.

Related Reading

More Insights

Currently we allow the following HTML tags in comments:

Single tags

These tags can be used alone and don't need an ending tag.

<br> Defines a single line break

<hr> Defines a horizontal line

Matching tags

These require an ending tag - e.g. <i>italic text</i>

<a> Defines an anchor

<b> Defines bold text

<big> Defines big text

<blockquote> Defines a long quotation

<caption> Defines a table caption

<cite> Defines a citation

<code> Defines computer code text

<em> Defines emphasized text

<fieldset> Defines a border around elements in a form

<h1> This is heading 1

<h2> This is heading 2

<h3> This is heading 3

<h4> This is heading 4

<h5> This is heading 5

<h6> This is heading 6

<i> Defines italic text

<p> Defines a paragraph

<pre> Defines preformatted text

<q> Defines a short quotation

<samp> Defines sample computer code text

<small> Defines small text

<span> Defines a section in a document

<s> Defines strikethrough text

<strike> Defines strikethrough text

<strong> Defines strong text

<sub> Defines subscripted text

<sup> Defines superscripted text

<u> Defines underlined text

Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task. However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.

Disqus Tips To upload an avatar photo, first complete your Disqus profile. | View the list of supported HTML tags you can use to style comments. | Please read our commenting policy.