page.title=Specifying the Code to Run on a Thread trainingnavtop=true @jd:body <div id="tb-wrapper"> <div id="tb"> <!-- table of contents --> <h2>This lesson teaches you to</h2> <ol> <li><a href="#ExtendClass">Define a Class that Implements Runnable</a></li> <li><a href="#RunMethod">Implement the run() Method</a> </ol> <h2>You should also read</h2> <ul> <li><a href="{@docRoot}guide/components/processes-and-threads.html">Processes and Threads</a></li> </ul> <h2>Try it out</h2> <div class="download-box"> <a href="{@docRoot}shareables/training/ThreadSample.zip" class="button">Download the sample</a> <p class="filename">ThreadSample.zip</p> </div> <!-- download-box --> </div> <!-- tb --> </div> <!-- tb-wrapper --> <p> This lesson shows you how to implement a {@link java.lang.Runnable} class, which runs the code in its {@link java.lang.Runnable#run Runnable.run()} method on a separate thread. You can also pass a {@link java.lang.Runnable} to another object that can then attach it to a thread and run it. One or more {@link java.lang.Runnable} objects that perform a particular operation are sometimes called a <i>task</i>. </p> <p> {@link java.lang.Thread} and {@link java.lang.Runnable} are basic classes that, on their own, have only limited power. Instead, they're the basis of powerful Android classes such as {@link android.os.HandlerThread}, {@link android.os.AsyncTask}, and {@link android.app.IntentService}. {@link java.lang.Thread} and {@link java.lang.Runnable} are also the basis of the class {@link java.util.concurrent.ThreadPoolExecutor}. This class automatically manages threads and task queues, and can even run multiple threads in parallel. </p> <h2 id="ExtendClass">Define a Class that Implements Runnable</h2> <p> Implementing a class that implements {@link java.lang.Runnable} is straightforward. For example: </p> <pre> public class PhotoDecodeRunnable implements Runnable { ... @Override public void run() { /* * Code you want to run on the thread goes here */ ... } ... } </pre> <h2 id="RunMethod">Implement the run() Method</h2> <p> In the class, the {@link java.lang.Runnable#run Runnable.run()} method contains the code that's executed. Usually, anything is allowable in a {@link java.lang.Runnable}. Remember, though, that the {@link java.lang.Runnable} won't be running on the UI thread, so it can't directly modify UI objects such as {@link android.view.View} objects. To communicate with the UI thread, you have to use the techniques described in the lesson <a href="communicate-ui.html">Communicate with the UI Thread</a>. </p> <p> At the beginning of the {@link java.lang.Runnable#run run()} method, set the thread to use background priority by calling {@link android.os.Process#setThreadPriority Process.setThreadPriority()} with {@link android.os.Process#THREAD_PRIORITY_BACKGROUND}. This approach reduces resource competition between the {@link java.lang.Runnable} object's thread and the UI thread. </p> <p> You should also store a reference to the {@link java.lang.Runnable} object's {@link java.lang.Thread} in the {@link java.lang.Runnable} itself, by calling {@link java.lang.Thread#currentThread() Thread.currentThread()}. </p> <p> The following snippet shows how to set up the {@link java.lang.Runnable#run run()} method: </p> <pre> class PhotoDecodeRunnable implements Runnable { ... /* * Defines the code to run for this task. */ @Override public void run() { // Moves the current Thread into the background android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND); ... /* * Stores the current Thread in the PhotoTask instance, * so that the instance * can interrupt the Thread. */ mPhotoTask.setImageDecodeThread(Thread.currentThread()); ... } ... } </pre>