<?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>Martin&#039;s Weekend Coding &#187; Concurrency</title>
	<atom:link href="http://blog.alutam.com/tag/concurrency/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.alutam.com</link>
	<description>Sharing useful tips from my &#34;weekend projects&#34;</description>
	<lastBuildDate>Sat, 31 Oct 2009 13:14:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
   <image>
    <title>Martin&#039;s Weekend Coding</title>
    <url>http://www.gravatar.com/avatar/fe13f36272d010f4b3c09e477a620991?s=</url>
    <link>http://blog.alutam.com</link>
   </image>
		<item>
		<title>Custom Asynchronous Tasks in JavaFX</title>
		<link>http://blog.alutam.com/2009/08/26/custom-asynchronous-tasks-in-javafx/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://blog.alutam.com/2009/08/26/custom-asynchronous-tasks-in-javafx/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 20:16:22 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[Concurrency]]></category>

		<guid isPermaLink="false">http://blog.alutam.com/?p=50</guid>
		<description><![CDATA[As I mentioned in my previous blog, during my experiments with JavaFX I needed to run certain tasks on a separate thread (e.g. calls to a remote web service via Jersey Client API). One can do it in JavaFX using JavaTaskBase class, but I wanted something simpler, something similar to what FXexperience blog suggested. So, [...]]]></description>
			<content:encoded><![CDATA[<p>As I mentioned in my previous blog, during my experiments with JavaFX I needed to run certain tasks on a separate thread (e.g. calls to a remote web service via Jersey Client API). One can do it in JavaFX using JavaTaskBase class, but I wanted something simpler, something similar to what <a href="http://fxexperience.com/2009/06/background-tasks-in-javafx/">FXexperience blog</a> suggested. So, I created a custom subclass of javafx.async.Task named AsyncTask that allowed me to make asynchronous calls as follows:</p>
<div class="codebox">
<pre>    <span class="Identifier">AsyncTask</span> <span class="Braces">{</span>
        <span class="Identifier">run</span><span class="Symbol">:</span> <span class="Identifier">function</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="Comment">// add the code you want to run asynchronously</span>
        <span class="Braces">}</span>

        <span class="Identifier">onDone</span><span class="Symbol">:</span> <span class="Identifier">function</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="Comment">// this is executed once the "run" method finishes running</span>
        <span class="Braces">}</span>
    <span class="Braces">}</span>.<span class="Identifier">start</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span></pre>
</div>
<p>Here is the source code for the AsyncTask class together with the helper Java class it&#8217;s using. It should be self explanatory.</p>
<div>
<pre><small><em>AsyncTask.fx</em></small></pre>
</div>
<div class="codebox">
<pre><span class="Include">import javafx.async.Task;</span>

<span class="ReservedWord">public</span> <span class="ReservedWord">class</span> <span class="Identifier">AsyncTask</span> <span class="ReservedWord">extends</span> <span class="Identifier">Task</span>, <span class="Identifier">AsyncTaskHelper</span>.<span class="Identifier">Task</span> <span class="Braces">{</span>
    <span class="DocComment">/** Function that should be run asynchronously.
     */</span>
    <span class="ReservedWord">public</span> <span class="Identifier">var</span> <span class="Identifier">run</span><span class="Symbol">:</span> <span class="Identifier">function</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Symbol">=</span> <span class="ReservedWord">null</span><span class="Symbol">;</span>

    <span class="Comment">// the helper</span>
    <span class="Identifier">def</span> <span class="Identifier">peer</span> <span class="Symbol">=</span> <span class="ReservedWord">new</span> <span class="Identifier">AsyncTaskHelper</span><span class="Braces">(</span><span class="ReservedWord">this</span><span class="Braces">)</span><span class="Symbol">;</span>

    <span class="Comment">// used to start the task</span>
    <span class="Identifier">override</span> <span class="Identifier">function</span> <span class="Identifier">start</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Identifier">started</span> <span class="Symbol">=</span> <span class="ReservedWord">true</span><span class="Symbol">;</span>
        <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">onStart</span> <span class="Symbol">!</span><span class="Symbol">=</span> <span class="ReservedWord">null</span><span class="Braces">)</span> <span class="Identifier">onStart</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Identifier">peer</span>.<span class="Identifier">start</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    <span class="Comment">// don't need stop - isn't implemented</span>
    <span class="Identifier">override</span> <span class="Identifier">function</span> <span class="Identifier">stop</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Comment">// do nothing</span>
    <span class="Braces">}</span>

    <span class="Comment">// called from the helper Java class from a different thread</span>
    <span class="Identifier">override</span> <span class="Identifier">function</span> <span class="Identifier">taskRun</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Comment">// run the code to be run asynchronously</span>
        <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">run</span> <span class="Symbol">!</span><span class="Symbol">=</span> <span class="ReservedWord">null</span><span class="Braces">)</span> <span class="Identifier">run</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Comment">// send a notification (on the dispatch thread) the code finished running</span>
        <span class="Identifier">FX</span>.<span class="Identifier">deferAction</span><span class="Braces">(</span><span class="Identifier">function</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="Identifier">done</span> <span class="Symbol">=</span> <span class="ReservedWord">true</span><span class="Symbol">;</span>
            <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">onDone</span> <span class="Symbol">!</span><span class="Symbol">=</span> <span class="ReservedWord">null</span><span class="Braces">)</span> <span class="Identifier">onDone</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Braces">}</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
<div>
<pre><small><em>AsyncTaskHelper.java</em></small></pre>
</div>
<div class="codebox">
<pre><span class="Include">import java.util.concurrent.ExecutorService;</span>
<span class="Include">import java.util.concurrent.Executors;</span>

<span class="ReservedWord">public</span> <span class="ReservedWord">class</span> <span class="Identifier">AsyncTaskHelper</span> <span class="ReservedWord">implements</span> <span class="Identifier">Runnable</span> <span class="Braces">{</span>
    <span class="Comment">// Using a fixed threadpool to run the asynchronous task</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">static</span> <span class="ReservedWord">final</span> <span class="Identifier">ExecutorService</span> <span class="Identifier">QUEUE</span> <span class="Symbol">=</span> <span class="Identifier">Executors</span>.<span class="Identifier">newFixedThreadPool</span><span class="Braces">(</span><span class="Numeric">10</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Comment">// the "parent" JavaFX AsyncTask instance</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">final</span> <span class="Identifier">Task</span> <span class="Identifier">peer</span><span class="Symbol">;</span>

    <span class="ReservedWord">public</span> <span class="Identifier">AsyncTaskHelper</span><span class="Braces">(</span><span class="Identifier">Task</span> <span class="Identifier">peer</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="ReservedWord">this</span>.<span class="Identifier">peer</span> <span class="Symbol">=</span> <span class="Identifier">peer</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    <span class="Comment">// called from AsyncTask.start() method - will add this task</span>
    <span class="Comment">// to the thread pool queue</span>
    <span class="ReservedWord">public</span> <span class="ReservedWord">void</span> <span class="Identifier">start</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Identifier">QUEUE</span>.<span class="Identifier">execute</span><span class="Braces">(</span><span class="ReservedWord">this</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    <span class="Comment">// called by the thread pool queue to start the task</span>
    <span class="ReservedWord">public</span> <span class="ReservedWord">void</span> <span class="Identifier">run</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Identifier">peer</span>.<span class="Identifier">taskRun</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    <span class="Comment">// interface to be implemented by the "parent" JavaFX AsyncTask</span>
    <span class="ReservedWord">public</span> <span class="ReservedWord">static</span> <span class="ReservedWord">interface</span> <span class="Identifier">Task</span> <span class="Braces">{</span>
        <span class="ReservedWord">public</span> <span class="ReservedWord">void</span> <span class="Identifier">taskRun</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.alutam.com/2009/08/26/custom-asynchronous-tasks-in-javafx/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
