cfthread

Description

The cfthread tag enables you to create threads, independent streams of code execution, in your ColdFusion application. You use this tag to run or end a thread, temporarily stop thread execution, or join together multiple threads.

Categories

Related

History

ColdFusion 8: Added this tag

Syntax

join 
    <cfthread 
    required 
    name="thread name[,thread name]..." 
    optional 
    action="join" 
    timeout="milliseconds"/> 
 
run 
    <cfthread 
    required 
    name="thread name" 
    optional 
    action="run" 
    priority="NORMAL|HIGH|LOW" 
    zero or more application-specific attributes> 
 
        Thread code 
 
    </cfthread> 
 
sleep 
    <cfthread 
    required 
    action="sleep" 
    duration="milliseconds"/> 
 
terminate 
    <cfthread 
    required 
    action="terminate" 
    name="thread name"/>
For all actions except run, the cfthread tag must have an empty body and be followed immediately by a </cfthread> end tag, or must have no end tag and have a slash before the tag closure, as in <cfthread action="sleep" duration="1000"/>. Note: You can specify this tag’s attributes in an attributeCollection attribute whose value is a structure. Specify the structure name in the attributeCollection attribute and use the tag’s attribute names as structure keys.

Attributes

AttributeDescriptionRequiredDefault
actionOptional
durationRequired
nameOptional, Required, if action = "join" or "terminate"
priorityOptional
timeoutOptional

Usage

Page-level code (code outside any cfthread tags) executes in its own thread, referred to as the page thread. Only the page thread can create other threads. A thread that you create cannot create a child thread.
Note: If a thread never completes processing (is hung), it continues to occupy system resources. You can use the ColdFusion Sever Monitor to check for and terminate hung threads.
ColdFusion makes a complete (deep) copy of all the attribute variables before passing them to the thread, so the values of the variables inside the thread are independent of the values of any corresponding variables in other threads, including the page thread. Thus, the values passed to threads are thread safe because the attribute values cannot be changed by any other thread.

Example

The following example uses three threads to get the results of three RSS feeds. The user must submit the form with all three feeds specified. The application joins the threads with a time-out of 6 seconds, and displays the feed titles and the individual item titles as links.
<!--- Run this code if the feed URL form has been submitted. ---> 
<cfif isDefined("Form.submit")> 
    <cfloop index="i" from="1" to="3"> 
        <!--- Use array notation and string concatenation to create a variable 
                 for this feed. ---> 
        <cfset theFeed = Form["Feed"&i]> 
        <cfif theFeed NEQ ""> 
            <!--- Use a separate thread to get each of the feeds. ---> 
            <cfthread action="run" name="t#i#" feed="#theFeed#"> 
                <cffeed source="#feed#"  
                    properties="thread.myProps"  
                    query="thread.myQuery"> 
            </cfthread> 
        <cfelse> 
            <!--- If the user didn't fill all fields, show an error message. ---> 
            <h3>This example requires three feeds.<br /> 
            Click the Back button and try again.</h3> 
            <cfabort> 
        </cfif> 
    </cfloop> 
 
    <!--- Join the three threads. Use a 6 second time-out. ---> 
    <cfthread action="join" name="t1,t2,t3" timeout="6000" /> 
     
    <!--- Use a loop to display the results from the feeds. ---> 
    <cfloop index="i" from="1" to="3"> 
        <!--- Use the cfthread scope and associative array notation to get the 
                Thread scope dynamically. ---> 
        <cfset feedResult=cfthread["t#i#"]> 
        <!--- Display feed information only if you got items, 
                 for example the feed must complete before the join. ---> 
        <cfif isDefined("feedResult.myQuery")> 
            <cfoutput><h2>#feedResult.myProps.title#</h2></cfoutput> 
            <cfoutput query="feedResult.myQuery"> 
                <a href="#RSSLINK#">#TITLE#</a></p> 
            </cfoutput> 
        </cfif> 
    </cfloop> 
 
</cfif> 
 
<!--- The form for entering the feeds to aggregate. ---> 
<cfform> 
    <h3>Enter three RSS Feeds</h3> 
    <cfinput type="text" size="100" name="Feed1" validate="url" 
        value="http://rss.adobe.com/events.rss?locale=en"><br /> 
    <cfinput type="text" size="100" name="Feed2" validate="url" 
        value="http://weblogs.macromedia.com/dev_center/index.rdf"><br /> 
    <cfinput type="text" size="100" name="Feed3" validate="url"  
        value="http://rss.adobe.com/studio.rss?locale=en"><br /> 
    <cfinput type="submit" name="submit"> 
</cfform>