<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>info.michael-simons.eu &#187; Swing</title>
	<atom:link href="http://info.michael-simons.eu/tag/swing/feed/" rel="self" type="application/rss+xml" />
	<link>http://info.michael-simons.eu</link>
	<description>Just another nerd blog</description>
	<lastBuildDate>Wed, 08 Feb 2012 10:26:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Enabling tooltips on a JTree</title>
		<link>http://info.michael-simons.eu/2008/08/12/enabling-tooltips-on-a-jtree/</link>
		<comments>http://info.michael-simons.eu/2008/08/12/enabling-tooltips-on-a-jtree/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 09:59:50 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[English posts]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[J2SE]]></category>
		<category><![CDATA[Swing]]></category>

		<guid isPermaLink="false">http://info.michael-simons.eu/?p=200</guid>
		<description><![CDATA[Thinks i keep forgetting. Today: Enabling a JTree in J2SE to show different tooltips on his nodes: 1. Create a custom tree renderer like so: import java.awt.Component; &#160; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; &#160; public class TooltipTreeRenderer extends DefaultTreeCellRenderer &#123; @Override public Component getTreeCellRendererComponent&#40;JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int [...]]]></description>
			<content:encoded><![CDATA[<p>Thinks i keep forgetting. Today: Enabling a JTree in J2SE to show different tooltips on his nodes:</p>
<p>1. Create a custom tree renderer like so:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.Component</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.JTree</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.tree.DefaultMutableTreeNode</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.tree.DefaultTreeCellRenderer</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TooltipTreeRenderer  <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">DefaultTreeCellRenderer</span>  <span style="color: #009900;">&#123;</span>	
  @Override
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Component</span> getTreeCellRendererComponent<span style="color: #009900;">&#40;</span><span style="color: #003399;">JTree</span> tree, <span style="color: #003399;">Object</span> value, <span style="color: #000066; font-weight: bold;">boolean</span> sel, <span style="color: #000066; font-weight: bold;">boolean</span> expanded, <span style="color: #000066; font-weight: bold;">boolean</span> leaf, <span style="color: #000066; font-weight: bold;">int</span> row, <span style="color: #000066; font-weight: bold;">boolean</span> hasFocus<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Component</span> rc <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">getTreeCellRendererComponent</span><span style="color: #009900;">&#40;</span>tree, value, sel, expanded, leaf, row, hasFocus<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
    <span style="color: #003399;">String</span> tooltip <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Compute some arbitrary text depending on the node (which is hidden behind 'value')&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">setToolTipText</span><span style="color: #009900;">&#40;</span>tooltip<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">return</span> rc<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>2. Set this renderer</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">aTree.<span style="color: #006633;">setCellRenderer</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> TooltipTreeRenderer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>3. Keep wondering, why the tooltip doesn&#8217;t show&#8230;</p>
<p>4. Register the tree with the ToolTipManager (which isn&#8217;t necessary for nearly all other Swing Components&#8230;)</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">javax.<span style="color: #006633;">swing</span>.<span style="color: #003399;">ToolTipManager</span>.<span style="color: #003399;">ToolTipManager</span>.<span style="color: #006633;">sharedInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">registerComponent</span><span style="color: #009900;">&#40;</span>aTree<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>5. Enjoy <img src='http://info.michael-simons.eu/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p class="akst_link"><a href="http://info.michael-simons.eu/?p=200&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_200" class="akst_share_link " rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://info.michael-simons.eu/2008/08/12/enabling-tooltips-on-a-jtree/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>On Java Threads: A fairytale of a tutorial</title>
		<link>http://info.michael-simons.eu/2007/07/12/on-java-threads-a-fairytale-of-a-tutorial/</link>
		<comments>http://info.michael-simons.eu/2007/07/12/on-java-threads-a-fairytale-of-a-tutorial/#comments</comments>
		<pubDate>Thu, 12 Jul 2007 19:56:33 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Swing]]></category>
		<category><![CDATA[Threads]]></category>
		<category><![CDATA[Tipps]]></category>

		<guid isPermaLink="false">http://info.michael-simons.eu/2007/07/12/on-java-threads-a-fairytale-of-a-tutorial/</guid>
		<description><![CDATA[I always thought that the Java Thread API is something&#8230; strange. If you work in a frontend application, things like running long-running tasks in the back without having the GUI ugly frozen and not responding should be somewhat simpler. SwingWorker has been around for quite a time but made it just recently into the core [...]]]></description>
			<content:encoded><![CDATA[<p>I always thought that the Java Thread <span class="caps">API</span> is something&#8230; strange. If you work in a frontend application, things like running long-running tasks in the back without having the <span class="caps">GUI</span> ugly frozen and not responding should be somewhat simpler.</p>
<p><a href="http://en.wikipedia.org/wiki/SwingWorker">SwingWorker</a> has been around for quite a time but made it just recently into the core <span class="caps">API</span> (Java6). Furthermore i don&#8217;t think that it&#8217;s the right thing for performing enduring tasks like checking for mail and pushing a result with a second thread into a database, for example.</p>
<p>Don&#8217;t get me wrong, i use SwingWorker quite often, but it didn&#8217;t fit my needs and furthermore, i wanted to learn more about Java Threads.</p>
<p>My goal / task was a little daemon that regularly checks an email account and a samba share for some files, load them into an Oracle Database and executes a longer running db procedure. The checking should be suspendable and stoppable independently, the configuration should be reloadable.</p>
<p>I throw some interfaces and abstract classes at the vm and boom, it was that simple <img src='http://info.michael-simons.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Things i&#8217;ve learned:</p>
<ul>
<li>Always start the <span class="caps">GUI</span> in it&#8217;s own thread, never use the main thread. Sure, most programs will work fine, but it can get confusing. Use <a href="http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/SwingUtilities.html">SwingUtilities</a> to do so.</li>
<li>A thread once terminated is not reusable. Never ever. So don&#8217;t interrupt them if you plan on resume them later.</li>
<li>Know the primitives, i.e. build in locks (synchronized and wait())</li>
<li>Know the task scheduling frameworks (<a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executors.html">Executors</a> and <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ExecutorService.html">ExecutorServices</a>)</li>
<li>Read the tutorials <a href="http://java.sun.com/j2se/1.5.0/docs/guide/concurrency/overview.html">here</a>, <a href="http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html">here</a> and maybe <a href="http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html">here</a></li>
</ul>
<p>The following demo can start 7 producers and one consumer, both are synchronized via a <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html">BlockingQueue</a> (i actually used a <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/SynchronousQueue.html">SynchronousQueue</a> at work, as the files must only be removed if they were taken by the db). Both the producers and consumers can be suspended, resumed and stopped. I never ever will start a thread by hand again if not necessary. The threads are managed by an ExecutorService.</p>
<p>For the tasked mentioned above this thing works fine. If anyone comes up with a better idea, let me know.</p>
<p>I had fun to write it, maybe you have fun to read. Be aware, the program is not a good example of organizing classes, i put everything in one file just for the sake of being a demo.</p>
<p>But apart from that, the demo could serve as an example of what came to Java with Java 5 and 6 as i use a lot of generics, enums and enhanced for loops, in case you haven&#8217;t seen this.</p>
<p>To compile and run the stuff you need at least a Java5 <span class="caps">JDK</span> (get it <a href="http://java.sun.com/javase/downloads/index_jdk5.jsp);">here</a>, download this file <a href="http://info.michael-simons.eu/wp-content/uploads/2007/07/JThreadDemo.zip">JThreadDemo.zip</a>, unzip it and type</p>
<pre>
javac snow/white/JThreadDemo.java
java snow.white.JThreadDemo
</pre>
<p>If you read this, i&#8217;ll guess you&#8217;re familiar with the <span class="caps">JDK</span>, java packages and the whole crap.</p>
<p>Get the whole fun after the click:</p>
<p><span id="more-103"></span></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">snow.white</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/*
 * This little fairytale was written by
 * Michael Simons
 * http://michael-simons.eu
 * 
 * If you like it, you can drop me line :)
 * 
 * It's published under the Beerware License: 
 * http://en.wikipedia.org/wiki/Beerware
 *
 * ----------------------------------------------------------------------------
 * &quot;THE BEER-WARE LICENSE&quot;:
 * &lt;misi@planet-punk.de&gt; wrote this file. As long as you retain this notice you
 * can do whatever you want with this stuff. If we meet some day, and you think
 * this stuff is worth it, you can buy me a beer in return
 * Michael Simons
 * ----------------------------------------------------------------------------
 */</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.BorderLayout</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.Container</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.Cursor</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.event.ActionEvent</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.awt.event.ActionListener</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.OutputStream</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.PrintStream</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.ArrayList</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.HashMap</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.List</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Map</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Random</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.concurrent.ArrayBlockingQueue</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.concurrent.BlockingQueue</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.concurrent.Callable</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.concurrent.ExecutorService</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.concurrent.Executors</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.concurrent.FutureTask</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.concurrent.TimeUnit</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.JButton</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.JFrame</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.JScrollPane</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.JTextArea</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.JToolBar</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.SwingUtilities</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.event.DocumentEvent</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.event.DocumentListener</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">javax.swing.text.Document</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * This abstract working thingy represents my special runnable
 * which is suspendable as well as resumable and stoppable.
 * @author michael
 */</span>
<span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> AbstractWorkingThingy <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399;">Runnable</span> <span style="color: #009900;">&#123;</span>	
	<span style="color: #008000; font-style: italic; font-weight: bold;">/** A flag to indicate wether the task ended or not */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">boolean</span> ended      <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>	
	<span style="color: #008000; font-style: italic; font-weight: bold;">/** A flag to indicate wether the task should stop */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">boolean</span> stopped    <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/** A flag to indicate wether the task should be suspended */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">boolean</span> suspended  <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/** The interval in secs in which to perform the duty */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">int</span> intervall <span style="color: #339933;">=</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/** The executing thread, can be null */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #003399;">Thread</span> currentThread<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * This methods called from anywhere (i.e. the event dispatching
	 * thread, edt) suspends the little working thing.
	 *
	 * The run method must use the mutex/semaphore &quot;this&quot; after
	 * isSuspend() is true as..	 
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> suspend<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">suspended</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * ..resume is synchronized to the same mutex and
	 * notifies all threads that are waiting for this	 
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">synchronized</span> <span style="color: #000066; font-weight: bold;">void</span> resume<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">suspended</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>		
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">notify</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>		
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * stop sets isStopped() to true. If the thing is suspended,
	 * it also wakes it as the run loop wouldn't stop otherwise
	 * 
	 * If the executing thread was safed in run, the thread
	 * gets also interrupted, so that any sleeping method
	 * wakes up from their dreams.
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> stop<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">stopped</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// Wake the sleeping for that they come to an end</span>
		<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>suspended<span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">resume</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// Interrupt anything that is waiting</span>
		<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>currentThread <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
			currentThread.<span style="color: #006633;">interrupt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * This thing just indicates isStopped() is false...
	 * Can be overriden to do some configuration work i.e.  
	 * bringing in some cookies and cream.	 
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">synchronized</span> <span style="color: #000066; font-weight: bold;">void</span> start<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">stopped</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>		
	<span style="color: #009900;">&#125;</span>	
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> isEnded<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">ended</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> isSuspended<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">suspended</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">ended</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> isStopped<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">stopped</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> isRunning<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>isStopped<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>  isSuspended<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> getIntervall<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> intervall<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setIntervall<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> intervall<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">intervall</span> <span style="color: #339933;">=</span> intervall<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>			
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * Just a little something to pass along, like chips with beer.
 * @author michael
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> Item <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> diggedby<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> val<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getDiggedby<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> diggedby<span style="color: #339933;">;</span>		
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Item setDiggedby<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> diggedby<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">diggedby</span> <span style="color: #339933;">=</span> diggedby<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> getVal<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> val<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Item setVal<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> val<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">val</span> <span style="color: #339933;">=</span> val<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>		
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * The greedy one... it takes all the cookies from the dwarfs.
 * @author michael 
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> Consumer <span style="color: #000000; font-weight: bold;">extends</span> AbstractWorkingThingy <span style="color: #009900;">&#123;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/** The synchronizing queue is the source for the consumer */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> BlockingQueue<span style="color: #339933;">&lt;</span>Item<span style="color: #339933;">&gt;</span> source<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">PrintStream</span> log<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Consumer<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> BlockingQueue<span style="color: #339933;">&lt;</span>Item<span style="color: #339933;">&gt;</span> source, <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">PrintStream</span> log<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">source</span> <span style="color: #339933;">=</span> source<span style="color: #339933;">;</span>	
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">log</span> <span style="color: #339933;">=</span> log<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// I'm not dead yet...</span>
		<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">ended</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// In case somebody wants to wake me</span>
		<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">currentThread</span> <span style="color: #339933;">=</span> <span style="color: #003399;">Thread</span>.<span style="color: #006633;">currentThread</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// For now and ever... and ever... </span>
		<span style="color: #000000; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>isStopped<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>					
			<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>							
				<span style="color: #666666; font-style: italic;">// Check my source for new cookies for intervall secs.</span>
				<span style="color: #666666; font-style: italic;">// The queue will then return a null value if nothings there. </span>
				<span style="color: #666666; font-style: italic;">// The wait is as good as a sleep.</span>
				<span style="color: #000000; font-weight: bold;">final</span> Item item <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">source</span>.<span style="color: #006633;">poll</span><span style="color: #009900;">&#40;</span>intervall, TimeUnit.<span style="color: #006633;">SECONDS</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>item <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> 
					log.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>currentThread.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span><span style="color: #0000ff;">&quot;:  &quot;</span> <span style="color: #339933;">+</span> 
							<span style="color: #0000ff;">&quot;Hey, i got &quot;</span> <span style="color: #339933;">+</span> item.<span style="color: #006633;">getVal</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> 
							<span style="color: #0000ff;">&quot; from &quot;</span> <span style="color: #339933;">+</span> item.<span style="color: #006633;">getDiggedby</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
					<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #666666; font-style: italic;">// Ups, somebody wants me suspended...</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>isSuspended<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #666666; font-style: italic;">// ... so i wait til someone notifies me</span>
					<span style="color: #000000; font-weight: bold;">synchronized</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
						wait<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>             
					<span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span>				
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">InterruptedException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #666666; font-style: italic;">// Ok, they don't need me... </span>
				<span style="color: #666666; font-style: italic;">// i go (i was stopped and interrupted)</span>
				log.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;I was interrupted, quitting...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>	
		<span style="color: #666666; font-style: italic;">// Now i'm dead!</span>
		<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">ended</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>				
	<span style="color: #009900;">&#125;</span>	
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * My little working class heroe.
 * @author michael 
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> Producer <span style="color: #000000; font-weight: bold;">extends</span> AbstractWorkingThingy <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> name<span style="color: #339933;">;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/** The synchronizing queue is the target for the producer */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> BlockingQueue<span style="color: #339933;">&lt;</span>Item<span style="color: #339933;">&gt;</span> target<span style="color: #339933;">;</span>		
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">PrintStream</span> log<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Producer<span style="color: #009900;">&#40;</span>
			<span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> name, 
			<span style="color: #000000; font-weight: bold;">final</span> BlockingQueue<span style="color: #339933;">&lt;</span>Item<span style="color: #339933;">&gt;</span> target, 
			<span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">PrintStream</span> log
	<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">name</span> <span style="color: #339933;">=</span> name<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">target</span> <span style="color: #339933;">=</span> target<span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">log</span> <span style="color: #339933;">=</span> log<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/** 
	 * @see java.lang.Runnable#run()
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Same blah blah as above...</span>
		<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">ended</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>		
		<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">currentThread</span> <span style="color: #339933;">=</span> <span style="color: #003399;">Thread</span>.<span style="color: #006633;">currentThread</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Random</span> r <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Random</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">System</span>.<span style="color: #006633;">currentTimeMillis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>isStopped<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>					
				<span style="color: #666666; font-style: italic;">// I do my duty and try to put something in the basket...</span>
				<span style="color: #666666; font-style: italic;">// be aware: the queue can be synchron: one man in, one man out,</span>
				<span style="color: #666666; font-style: italic;">// it can be full or maybe the world has ended on the other </span>
				<span style="color: #666666; font-style: italic;">// side, either way, put can be block for a loooong time...</span>
				<span style="color: #666666; font-style: italic;">//</span>
				<span style="color: #666666; font-style: italic;">// An alternative is just offering something like so:</span>
				<span style="color: #666666; font-style: italic;">// target.offer(o, timeout, unit)				</span>
				target.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Item<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setDiggedby</span><span style="color: #009900;">&#40;</span>name<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setVal</span><span style="color: #009900;">&#40;</span>r.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				log.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>
						currentThread.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;: &quot;</span> <span style="color: #339933;">+</span> 
						name <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; digged something...&quot;</span>
				<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #666666; font-style: italic;">// Same blah blah as above...</span>
				<span style="color: #003399;">Thread</span>.<span style="color: #006633;">sleep</span><span style="color: #009900;">&#40;</span>intervall <span style="color: #339933;">*</span> <span style="color: #cc66cc;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>isSuspended<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #000000; font-weight: bold;">synchronized</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
						wait<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>             
					<span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">InterruptedException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				log.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>name <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; was interrupted, quitting...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">Exception</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				log.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>name <span style="color: #339933;">+</span> 
						<span style="color: #0000ff;">&quot; got an error while digging: &quot;</span> <span style="color: #339933;">+</span> e.<span style="color: #006633;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>				
				<span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>		
&nbsp;
		<span style="color: #666666; font-style: italic;">// I guess, you know the game...</span>
		<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">ended</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> name<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>		
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> JThreadDemo <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #003399;">JFrame</span> <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399;">ActionListener</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">enum</span> Command <span style="color: #009900;">&#123;</span>
		START_PRODUCERS<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Start or resume producers&quot;</span><span style="color: #009900;">&#41;</span>, 
		SUSPEND_PRODUCERS<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Suspend producers&quot;</span><span style="color: #009900;">&#41;</span>, 
		STOP_PRODUCERS<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Stop producers&quot;</span><span style="color: #009900;">&#41;</span>, 
		START_CONSUMER<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Start consumer&quot;</span><span style="color: #009900;">&#41;</span>, 
		STOP_CONSUMER<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Stop consumer&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> name<span style="color: #339933;">;</span>
&nbsp;
		Command<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> name<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">name</span> <span style="color: #339933;">=</span> name<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>	
			<span style="color: #000000; font-weight: bold;">return</span> name<span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>		
	<span style="color: #009900;">&#125;</span>		
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> <span style="color: #339933;">-</span>307930103825328797L<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/** My Actions */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> Map<span style="color: #339933;">&lt;</span>Command, JButton<span style="color: #339933;">&gt;</span> actions<span style="color: #339933;">;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/** Something to log to */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">JTextArea</span> textArea<span style="color: #339933;">;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/** The FIFO buffer for producers and consumers */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> BlockingQueue<span style="color: #339933;">&lt;</span>Item<span style="color: #339933;">&gt;</span> sync<span style="color: #339933;">;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/** The one and only consumer */</span>	
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> Consumer consumer<span style="color: #339933;">;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/** The dwarfs that dig the earth */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> List<span style="color: #339933;">&lt;</span>Producer<span style="color: #339933;">&gt;</span> producers<span style="color: #339933;">;</span>	
	<span style="color: #008000; font-style: italic; font-weight: bold;">/** One executor to rule them all */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> ExecutorService executor<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">PrintStream</span> log<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> JThreadDemo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">super</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Michaels funny little thread demo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// I want the demo to exit without any additional exit listener</span>
		<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">setDefaultCloseOperation</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">JFrame</span>.<span style="color: #006633;">EXIT_ON_CLOSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>			
&nbsp;
		<span style="color: #666666; font-style: italic;">// Initializing the toolbar</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">actions</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HashMap<span style="color: #339933;">&lt;</span>Command, JButton<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">JToolBar</span> tb <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JToolBar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>Command command <span style="color: #339933;">:</span> Command.<span style="color: #006633;">values</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">JButton</span> b <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JButton</span><span style="color: #009900;">&#40;</span>command.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
			b.<span style="color: #006633;">setActionCommand</span><span style="color: #009900;">&#40;</span>command.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			b.<span style="color: #006633;">addActionListener</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>			
			tb.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">actions</span>.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>command, b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>		
&nbsp;
		<span style="color: #666666; font-style: italic;">// Our log pane</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">textArea</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JTextArea</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">log</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">PrintStream</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">OutputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			@Override
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> write<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> b<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span>
				JThreadDemo.<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">textArea</span>.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>
						<span style="color: #666666; font-style: italic;">// Yeah, i know, i couldn't think of anything</span>
						<span style="color: #666666; font-style: italic;">// less performant...</span>
						<span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>b<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>			
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
&nbsp;
		<span style="color: #666666; font-style: italic;">// Doing some layout crap</span>
		<span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Container</span> cp <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">getContentPane</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		cp.<span style="color: #006633;">setLayout</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">BorderLayout</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		cp.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>tb,                             <span style="color: #003399;">BorderLayout</span>.<span style="color: #006633;">PAGE_START</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		cp.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">JScrollPane</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">textArea</span><span style="color: #009900;">&#41;</span>, <span style="color: #003399;">BorderLayout</span>.<span style="color: #006633;">CENTER</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// I want to tail the messages</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">textArea</span>.<span style="color: #006633;">getDocument</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">addDocumentListener</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">DocumentListener</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> tail<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Document</span> document<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				JThreadDemo.<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">textArea</span>.<span style="color: #006633;">setCaretPosition</span><span style="color: #009900;">&#40;</span>
						document.<span style="color: #006633;">getLength</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>				
			<span style="color: #009900;">&#125;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> changedUpdate<span style="color: #009900;">&#40;</span><span style="color: #003399;">DocumentEvent</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">tail</span><span style="color: #009900;">&#40;</span>e.<span style="color: #006633;">getDocument</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> insertUpdate<span style="color: #009900;">&#40;</span><span style="color: #003399;">DocumentEvent</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">tail</span><span style="color: #009900;">&#40;</span>e.<span style="color: #006633;">getDocument</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>				
			<span style="color: #009900;">&#125;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> removeUpdate<span style="color: #009900;">&#40;</span><span style="color: #003399;">DocumentEvent</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">tail</span><span style="color: #009900;">&#40;</span>e.<span style="color: #006633;">getDocument</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>				
			<span style="color: #009900;">&#125;</span>			
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
		<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">pack</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">setSize</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">getSize</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">width</span>, <span style="color: #cc66cc;">480</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Building the fairytale		</span>
		<span style="color: #666666; font-style: italic;">// The means of communicate</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">sync</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ArrayBlockingQueue<span style="color: #339933;">&lt;</span>Item<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// The consumer...</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">consumer</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Consumer<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">sync</span>, <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">log</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">consumer</span>.<span style="color: #006633;">setIntervall</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// ...and somewhat more than a handfull of producers</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">producers</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ArrayList<span style="color: #339933;">&lt;</span>Producer<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Yeah, the 7 dwarfes get ready for work...</span>
		<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> name <span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #0000ff;">&quot;Bashful&quot;</span>, <span style="color: #0000ff;">&quot;Doc&quot;</span>, <span style="color: #0000ff;">&quot;Dopey&quot;</span>, 
				<span style="color: #0000ff;">&quot;Grumpy&quot;</span>, <span style="color: #0000ff;">&quot;Happy&quot;</span>, <span style="color: #0000ff;">&quot;Sleepy&quot;</span>, 
				<span style="color: #0000ff;">&quot;Sneezy&quot;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> 			
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">producers</span>.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Producer<span style="color: #009900;">&#40;</span>name, sync, <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">log</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>						
&nbsp;
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">executor</span> <span style="color: #339933;">=</span> Executors.<span style="color: #006633;">newCachedThreadPool</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">checkActions</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> actionPerformed<span style="color: #009900;">&#40;</span><span style="color: #003399;">ActionEvent</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		Command cmd <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			cmd <span style="color: #339933;">=</span> Command.<span style="color: #006633;">valueOf</span><span style="color: #009900;">&#40;</span>e.<span style="color: #006633;">getActionCommand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">IllegalArgumentException</span> ex<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// We can safely ignore this...</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// If you want to use a switch statement, do it like this:</span>
		<span style="color: #666666; font-style: italic;">// Command.START_PRODUCERS can for whatever reason not</span>
		<span style="color: #666666; font-style: italic;">// to be used in the case</span>
		<span style="color: #666666; font-style: italic;">/*
		switch(cmd) {
		case START_PRODUCERS:
			this.startOrResumeAllProducers();
			break;
		case SUSPEND_PRODUCERS:
			this.suspendAllProducers();
			break;
		// etc.pp.
		}
		*/</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>cmd <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
			log.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Invalid command...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>cmd <span style="color: #339933;">==</span> Command.<span style="color: #006633;">START_PRODUCERS</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">startOrResumeAllProducers</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>cmd <span style="color: #339933;">==</span> Command.<span style="color: #006633;">SUSPEND_PRODUCERS</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">suspendAllProducers</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>cmd <span style="color: #339933;">==</span> Command.<span style="color: #006633;">STOP_PRODUCERS</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">stopAllProducers</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>cmd <span style="color: #339933;">==</span> Command.<span style="color: #006633;">START_CONSUMER</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">startConsumer</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>cmd <span style="color: #339933;">==</span> Command.<span style="color: #006633;">STOP_CONSUMER</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">stopConsumer</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>				
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Checks every producer for its state and 
	 * brings it back to work or to a fresh start...
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> startOrResumeAllProducers<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		log.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Thread</span>.<span style="color: #006633;">currentThread</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> 
				<span style="color: #0000ff;">&quot;: Starting the producers...&quot;</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">Random</span> r <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Random</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">System</span>.<span style="color: #006633;">currentTimeMillis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000066; font-weight: bold;">int</span> running <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>Producer producer <span style="color: #339933;">:</span> producers<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// Let's see... suspended? than it's allready be executed...		</span>
			<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>producer.<span style="color: #006633;">isSuspended</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
				producer.<span style="color: #006633;">resume</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// Otherwise, start it and hand it over to the executor.</span>
			<span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>producer.<span style="color: #006633;">isEnded</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>			
				<span style="color: #666666; font-style: italic;">// I like surprises... so let them do the work in some</span>
				<span style="color: #666666; font-style: italic;">// random intervalls												</span>
				producer.<span style="color: #006633;">setIntervall</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Math</span>.<span style="color: #006633;">max</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span>,r.<span style="color: #006633;">nextInt</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>							
				producer.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
				log.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Producer &quot;</span> <span style="color: #339933;">+</span> producer.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot; has an &quot;</span> <span style="color: #339933;">+</span>
						<span style="color: #0000ff;">&quot;interval of &quot;</span> <span style="color: #339933;">+</span> producer.<span style="color: #006633;">getIntervall</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;sec&quot;</span>
				<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">executor</span>.<span style="color: #006633;">execute</span><span style="color: #009900;">&#40;</span>producer<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
			running <span style="color: #339933;">+=</span> producer.<span style="color: #006633;">isStopped</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> producer.<span style="color: #006633;">isSuspended</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">:</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		log.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Thread</span>.<span style="color: #006633;">currentThread</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>  <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;: Started &quot;</span> <span style="color: #339933;">+</span> running <span style="color: #339933;">+</span>
				<span style="color: #0000ff;">&quot; producers...&quot;</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">checkActions</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Suspends all producers. This method doesn't need to be synchronized
	 * as no-one is activly waiting to be notified.
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> suspendAllProducers<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>Producer producer <span style="color: #339933;">:</span> producers<span style="color: #009900;">&#41;</span> 
			producer.<span style="color: #006633;">suspend</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">checkActions</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Stopping all producers.
	 * This methods tries to stop all producers, giving them time to end 
	 * their jobs	 
	 */</span>
	@SuppressWarnings<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;unchecked&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> stopAllProducers<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">setEnabled</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
		<span style="color: #666666; font-style: italic;">// Can anyone tell me why the heck this works ... randomly??</span>
		<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">getGlassPane</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setCursor</span><span style="color: #009900;">&#40;</span>
				<span style="color: #003399;">Cursor</span>.<span style="color: #006633;">getPredefinedCursor</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Cursor</span>.<span style="color: #006633;">WAIT_CURSOR</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// So this can take a while, if a producer doesn't immediate respond to</span>
		<span style="color: #666666; font-style: italic;">// stop or ignores the interrupt (maybe it needs to disconnect from a </span>
		<span style="color: #666666; font-style: italic;">// database, his wife or just the fridge)</span>
		<span style="color: #666666; font-style: italic;">// So here comes the future task, with the callable and a rudimentary </span>
		<span style="color: #666666; font-style: italic;">// callback method:</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">executor</span>.<span style="color: #006633;">execute</span><span style="color: #009900;">&#40;</span>
				<span style="color: #666666; font-style: italic;">// The future tasks gets executed...</span>
				<span style="color: #000000; font-weight: bold;">new</span> FutureTask <span style="color: #009900;">&#40;</span>
						<span style="color: #666666; font-style: italic;">// ...and delegates to a callable</span>
						<span style="color: #666666; font-style: italic;">// This things are generics, so if they produce </span>
						<span style="color: #666666; font-style: italic;">// something, type them and return the corresponding </span>
						<span style="color: #666666; font-style: italic;">// result.</span>
						<span style="color: #000000; font-weight: bold;">new</span> Callable<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>												
							<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> call<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">&#123;</span>
								<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>Producer producer <span style="color: #339933;">:</span> producers<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
									<span style="color: #666666; font-style: italic;">// Oh, no need to get involved.</span>
									<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>producer.<span style="color: #006633;">isEnded</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
										<span style="color: #000000; font-weight: bold;">continue</span><span style="color: #339933;">;</span>	
									<span style="color: #666666; font-style: italic;">// Try to stop</span>
									producer.<span style="color: #006633;">stop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
									<span style="color: #666666; font-style: italic;">// ... as long as you wait for me ...</span>
									<span style="color: #000000; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>producer.<span style="color: #006633;">isEnded</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
										<span style="color: #666666; font-style: italic;">// Give them a chance to free resources</span>
										<span style="color: #000000; font-weight: bold;">synchronized</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
											log.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>
													<span style="color: #003399;">Thread</span>.<span style="color: #006633;">currentThread</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
													.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>  <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;: &quot;</span> <span style="color: #339933;">+</span>
													<span style="color: #0000ff;">&quot;Waiting for &quot;</span> <span style="color: #339933;">+</span>
													<span style="color: #0000ff;">&quot;producers to end...&quot;</span>
											<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
											<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>			
												<span style="color: #666666; font-style: italic;">// Some arbitrary wait time									</span>
												<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">wait</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
											<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">InterruptedException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>							
											<span style="color: #009900;">&#125;</span>	
										<span style="color: #009900;">&#125;</span>					
									<span style="color: #009900;">&#125;</span>											
								<span style="color: #009900;">&#125;</span>
								<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
							<span style="color: #009900;">&#125;</span>
&nbsp;
						<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
					<span style="color: #008000; font-style: italic; font-weight: bold;">/**
					 * This belongs to future tasks and acts like a callback 
					 * when the callable is done.
					 * If the callable isn't void, one can get the result with 
					 * &quot;get()&quot;
					 * @see java.util.concurrent.FutureTask#done()
					 */</span>
					@Override
					<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> done<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
						<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">done</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>												
						JThreadDemo.<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">getGlassPane</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setCursor</span><span style="color: #009900;">&#40;</span>
								<span style="color: #003399;">Cursor</span>.<span style="color: #006633;">getPredefinedCursor</span><span style="color: #009900;">&#40;</span>
										<span style="color: #003399;">Cursor</span>.<span style="color: #006633;">DEFAULT_CURSOR</span>
								<span style="color: #009900;">&#41;</span>
						<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
						JThreadDemo.<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">setEnabled</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
						JThreadDemo.<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">checkActions</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span>			
				<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> startConsumer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>consumer.<span style="color: #006633;">isSuspended</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
			consumer.<span style="color: #006633;">resume</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>consumer.<span style="color: #006633;">isEnded</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			consumer.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">executor</span>.<span style="color: #006633;">execute</span><span style="color: #009900;">&#40;</span>consumer<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">checkActions</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@SuppressWarnings<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;unchecked&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> stopConsumer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">setEnabled</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">getContentPane</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setCursor</span><span style="color: #009900;">&#40;</span>
				<span style="color: #003399;">Cursor</span>.<span style="color: #006633;">getPredefinedCursor</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Cursor</span>.<span style="color: #006633;">WAIT_CURSOR</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">executor</span>.<span style="color: #006633;">execute</span><span style="color: #009900;">&#40;</span>
				<span style="color: #000000; font-weight: bold;">new</span> FutureTask<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Callable<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">Object</span> call<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">Exception</span> <span style="color: #009900;">&#123;</span>
						<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>consumer.<span style="color: #006633;">isEnded</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
							consumer.<span style="color: #006633;">stop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
							<span style="color: #000000; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>consumer.<span style="color: #006633;">isEnded</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
								<span style="color: #000000; font-weight: bold;">synchronized</span> <span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
									log.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Thread</span>.<span style="color: #006633;">currentThread</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
											<span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;: Waiting for consumer to end...&quot;</span>
									<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
									<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
										<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">wait</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
									<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">InterruptedException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>							
									<span style="color: #009900;">&#125;</span>	
								<span style="color: #009900;">&#125;</span>					
							<span style="color: #009900;">&#125;</span>											
						<span style="color: #009900;">&#125;</span>
						<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span>
&nbsp;
				<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					@Override
					<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> done<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
						<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">done</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
						JThreadDemo.<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">getGlassPane</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setCursor</span><span style="color: #009900;">&#40;</span>
								<span style="color: #003399;">Cursor</span>.<span style="color: #006633;">getPredefinedCursor</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Cursor</span>.<span style="color: #006633;">DEFAULT_CURSOR</span>
								<span style="color: #009900;">&#41;</span>
						<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
						JThreadDemo.<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">setEnabled</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
						JThreadDemo.<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">checkActions</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span>			
				<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> checkActions<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">int</span> running <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>Producer producer <span style="color: #339933;">:</span> producers<span style="color: #009900;">&#41;</span> 
			running <span style="color: #339933;">+=</span> producer.<span style="color: #006633;">isRunning</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>		
&nbsp;
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">actions</span>.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>Command.<span style="color: #006633;">START_PRODUCERS</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setEnabled</span><span style="color: #009900;">&#40;</span>running <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">actions</span>.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>Command.<span style="color: #006633;">SUSPEND_PRODUCERS</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setEnabled</span><span style="color: #009900;">&#40;</span>running <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">actions</span>.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>Command.<span style="color: #006633;">STOP_PRODUCERS</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setEnabled</span><span style="color: #009900;">&#40;</span>running <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">actions</span>.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>Command.<span style="color: #006633;">START_CONSUMER</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setEnabled</span><span style="color: #009900;">&#40;</span>
				<span style="color: #339933;">!</span>consumer.<span style="color: #006633;">isRunning</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">actions</span>.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>Command.<span style="color: #006633;">STOP_CONSUMER</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setEnabled</span><span style="color: #009900;">&#40;</span>
				consumer.<span style="color: #006633;">isRunning</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">final</span> JThreadDemo demo <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JThreadDemo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">// First of all: Start the application in the right thread.</span>
		<span style="color: #666666; font-style: italic;">// Swing got its one event dispatching thread, leave the </span>
		<span style="color: #666666; font-style: italic;">// system thread alone.</span>
		<span style="color: #003399;">SwingUtilities</span>.<span style="color: #006633;">invokeLater</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Runnable</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>								
				demo.<span style="color: #006633;">setVisible</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>												
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>				
	<span style="color: #009900;">&#125;</span>	
<span style="color: #009900;">&#125;</span></pre></div></div>

<p class="akst_link"><a href="http://info.michael-simons.eu/?p=103&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_103" class="akst_share_link " rel="nofollow">Share This</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://info.michael-simons.eu/2007/07/12/on-java-threads-a-fairytale-of-a-tutorial/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.695 seconds -->

