From 8dd6275e2871bea1acb20cbdd98ea0451b3d5be0 Mon Sep 17 00:00:00 2001 From: Joe Malin Date: Mon, 26 Nov 2012 14:06:35 -0800 Subject: [PATCH] Android Training: Multiple Threads Change-Id: I58c472aa5ed82f6b4fb50d9bbb4e66841b9e99c3 --- .../multiple-threads/communicate-ui.jd | 263 ++++++++++++++++++ .../multiple-threads/create-threadpool.jd | 238 ++++++++++++++++ .../multiple-threads/define-runnable.jd | 110 ++++++++ docs/html/training/multiple-threads/index.jd | 83 ++++++ .../training/multiple-threads/run-code.jd | 148 ++++++++++ .../multiple-threads/threadsample.zip | Bin 0 -> 75204 bytes docs/html/training/training_toc.cs | 27 ++ 7 files changed, 869 insertions(+) create mode 100644 docs/html/training/multiple-threads/communicate-ui.jd create mode 100644 docs/html/training/multiple-threads/create-threadpool.jd create mode 100644 docs/html/training/multiple-threads/define-runnable.jd create mode 100644 docs/html/training/multiple-threads/index.jd create mode 100644 docs/html/training/multiple-threads/run-code.jd create mode 100644 docs/html/training/multiple-threads/threadsample.zip diff --git a/docs/html/training/multiple-threads/communicate-ui.jd b/docs/html/training/multiple-threads/communicate-ui.jd new file mode 100644 index 0000000000000..d9977d34c9e0f --- /dev/null +++ b/docs/html/training/multiple-threads/communicate-ui.jd @@ -0,0 +1,263 @@ +page.title=Communicating with the UI Thread + +trainingnavtop=true +@jd:body + +
+
+ + +

This lesson teaches you to

+
    +
  1. Define a Handler on the UI Thread
  2. +
  3. Move Data from a Task to the UI Thread +
+ +

You should also read

+ + + +

Try it out

+
+ Download the sample +

ThreadSample.zip

+
+ +
+
+

+ In the previous lesson you learned how to start a task on a thread managed by + {@link java.util.concurrent.ThreadPoolExecutor}. This final lesson shows you how to send data + from the task to objects running on the user interface (UI) thread. This feature allows your + tasks to do background work and then move the results to UI elements such as bitmaps. +

+

+ Every app has its own special thread that runs UI objects such as {@link android.view.View} + objects; this thread is called the UI thread. Only objects running on the UI thread have access + to other objects on that thread. Because tasks that you run on a thread from a thread pool + aren't running on your UI thread, they don't have access to UI objects. To move data + from a background thread to the UI thread, use a {@link android.os.Handler} that's + running on the UI thread. +

+

Define a Handler on the UI Thread

+

+ {@link android.os.Handler} is part of the Android system's framework for managing threads. A + {@link android.os.Handler} object receives messages and runs code to handle the messages. + Normally, you create a {@link android.os.Handler} for a new thread, but you can + also create a {@link android.os.Handler} that's connected to an existing thread. + When you connect a {@link android.os.Handler} to your UI thread, the code that handles messages + runs on the UI thread. +

+

+ Instantiate the {@link android.os.Handler} object in the constructor for the class that + creates your thread pools, and store the object in a global variable. Connect it to the UI + thread by instantiating it with the {@link android.os.Handler#Handler(Looper) Handler(Looper)} + constructor. This constructor uses a {@link android.os.Looper} object, which is another part of + the Android system's thread management framework. When you instantiate a + {@link android.os.Handler} based on a particular {@link android.os.Looper} instance, the + {@link android.os.Handler} runs on the same thread as the {@link android.os.Looper}. + For example: +

+
+private PhotoManager() {
+...
+    // Defines a Handler object that's attached to the UI thread
+    mHandler = new Handler(Looper.getMainLooper()) {
+    ...
+
+

+ Inside the {@link android.os.Handler}, override the {@link android.os.Handler#handleMessage + handleMessage()} method. The Android system invokes this method when it receives a new message + for a thread it's managing; all of the {@link android.os.Handler} objects for a particular + thread receive the same message. For example: +

+
+        /*
+         * handleMessage() defines the operations to perform when
+         * the Handler receives a new Message to process.
+         */
+        @Override
+        public void handleMessage(Message inputMessage) {
+            // Gets the image task from the incoming Message object.
+            PhotoTask photoTask = (PhotoTask) inputMessage.obj;
+            ...
+        }
+    ...
+    }
+}
+The next section shows how to tell the {@link android.os.Handler} to move data.
+
+

Move Data from a Task to the UI Thread

+

+ To move data from a task object running on a background thread to an object on the UI thread, + start by storing references to the data and the UI object in the task object. Next, pass the + task object and a status code to the object that instantiated the {@link android.os.Handler}. + In this object, send a {@link android.os.Message} containing the status and the task object to + the {@link android.os.Handler}. Because {@link android.os.Handler} is running on the UI thread, + it can move the data to the UI object. + +

Store data in the task object

+

+ For example, here's a {@link java.lang.Runnable}, running on a background thread, that decodes a + {@link android.graphics.Bitmap} and stores it in its parent object PhotoTask. + The {@link java.lang.Runnable} also stores the status code DECODE_STATE_COMPLETED. +

+
+// A class that decodes photo files into Bitmaps
+class PhotoDecodeRunnable implements Runnable {
+    ...
+    PhotoDecodeRunnable(PhotoTask downloadTask) {
+        mPhotoTask = downloadTask;
+    }
+    ...
+    // Gets the downloaded byte array
+    byte[] imageBuffer = mPhotoTask.getByteBuffer();
+    ...
+    // Runs the code for this task
+    public void run() {
+        ...
+        // Tries to decode the image buffer
+        returnBitmap = BitmapFactory.decodeByteArray(
+                imageBuffer,
+                0,
+                imageBuffer.length,
+                bitmapOptions
+        );
+        ...
+        // Sets the ImageView Bitmap
+        mPhotoTask.setImage(returnBitmap);
+        // Reports a status of "completed"
+        mPhotoTask.handleDecodeState(DECODE_STATE_COMPLETED);
+        ...
+    }
+    ...
+}
+...
+
+

+ PhotoTask also contains a handle to the {@link android.widget.ImageView} that + displays the {@link android.graphics.Bitmap}. Even though references to + the {@link android.graphics.Bitmap} and {@link android.widget.ImageView} are in the same object, + you can't assign the {@link android.graphics.Bitmap} to the {@link android.widget.ImageView}, + because you're not currently running on the UI thread. +

+

+ Instead, the next step is to send this status to the PhotoTask object. +

+

Send status up the object hierarchy

+

+ PhotoTask is the next higher object in the hierarchy. It maintains references to + the decoded data and the {@link android.view.View} object that will show the data. It receives + a status code from PhotoDecodeRunnable and passes it along to the object that + maintains thread pools and instantiates {@link android.os.Handler}: +

+
+public class PhotoTask {
+    ...
+    // Gets a handle to the object that creates the thread pools
+    sPhotoManager = PhotoManager.getInstance();
+    ...
+    public void handleDecodeState(int state) {
+        int outState;
+        // Converts the decode state to the overall state.
+        switch(state) {
+            case PhotoDecodeRunnable.DECODE_STATE_COMPLETED:
+                outState = PhotoManager.TASK_COMPLETE;
+                break;
+            ...
+        }
+        ...
+        // Calls the generalized state method
+        handleState(outState);
+    }
+    ...
+    // Passes the state to PhotoManager
+    void handleState(int state) {
+        /*
+         * Passes a handle to this task and the
+         * current state to the class that created
+         * the thread pools
+         */
+        sPhotoManager.handleState(this, state);
+    }
+    ...
+}
+
+

Move data to the UI

+

+ From the PhotoTask object, the PhotoManager object receives a status + code and a handle to the PhotoTask object. Because the status is + TASK_COMPLETE, creates a {@link android.os.Message} containing the state and task + object and sends it to the {@link android.os.Handler}: +

+
+public class PhotoManager {
+    ...
+    // Handle status messages from tasks
+    public void handleState(PhotoTask photoTask, int state) {
+        switch (state) {
+            ...
+            // The task finished downloading and decoding the image
+            case TASK_COMPLETE:
+                /*
+                 * Creates a message for the Handler
+                 * with the state and the task object
+                 */
+                Message completeMessage =
+                        mHandler.obtainMessage(state, photoTask);
+                completeMessage.sendToTarget();
+                break;
+            ...
+        }
+        ...
+    }
+
+

+ Finally, {@link android.os.Handler#handleMessage Handler.handleMessage()} checks the status + code for each incoming {@link android.os.Message}. If the status code is + TASK_COMPLETE, then the task is finished, and the PhotoTask object + in the {@link android.os.Message} contains both a {@link android.graphics.Bitmap} and an + {@link android.widget.ImageView}. Because + {@link android.os.Handler#handleMessage Handler.handleMessage()} is + running on the UI thread, it can safely move the {@link android.graphics.Bitmap} to the + {@link android.widget.ImageView}: +

+
+    private PhotoManager() {
+        ...
+            mHandler = new Handler(Looper.getMainLooper()) {
+                @Override
+                public void handleMessage(Message inputMessage) {
+                    // Gets the task from the incoming Message object.
+                    PhotoTask photoTask = (PhotoTask) inputMessage.obj;
+                    // Gets the ImageView for this task
+                    PhotoView localView = photoTask.getPhotoView();
+                    ...
+                    switch (inputMessage.what) {
+                        ...
+                        // The decoding is done
+                        case TASK_COMPLETE:
+                            /*
+                             * Moves the Bitmap from the task
+                             * to the View
+                             */
+                            localView.setImageBitmap(photoTask.getImage());
+                            break;
+                        ...
+                        default:
+                            /*
+                             * Pass along other messages from the UI
+                             */
+                            super.handleMessage(inputMessage);
+                    }
+                    ...
+                }
+                ...
+            }
+            ...
+    }
+...
+}
+
diff --git a/docs/html/training/multiple-threads/create-threadpool.jd b/docs/html/training/multiple-threads/create-threadpool.jd new file mode 100644 index 0000000000000..4a4ddb1255f8f --- /dev/null +++ b/docs/html/training/multiple-threads/create-threadpool.jd @@ -0,0 +1,238 @@ +page.title=Creating a Manager for Multiple Threads + +trainingnavtop=true +@jd:body + +
+
+ + +

This lesson teaches you to

+
    +
  1. Define the Thread Pool Class +
  2. Determine the Thread Pool Parameters
  3. +
  4. Create a Pool of Threads
  5. +
+ + +

You should also read

+ + +

Try it out

+
+ Download the sample +

ThreadSample.zip

+
+ + +
+
+ +

+ The previous lesson showed how to define a task that executes on a + separate thread. If you only want to run the task once, this may be all you need. If you want + to run a task repeatedly on different sets of data, but you only need one execution running at a + time, an {@link android.app.IntentService} suits your needs. To automatically run tasks + as resources become available, or to allow multiple tasks to run at the same time (or both), + you need to provide a managed collection of threads. To do this, use an instance of + {@link java.util.concurrent.ThreadPoolExecutor}, which runs a task from a queue when a thread + in its pool becomes free. To run a task, all you have to do is add it to the queue. +

+

+ A thread pool can run multiple parallel instances of a task, so you should ensure that your + code is thread-safe. Enclose variables that can be accessed by more than one thread in a + synchronized block. This approach will prevent one thread from reading the variable + while another is writing to it. Typically, this situation arises with static variables, but it + also occurs in any object that is only instantiated once. To learn more about this, read the + + Processes and Threads API guide. + +

+

Define the Thread Pool Class

+

+ Instantiate {@link java.util.concurrent.ThreadPoolExecutor} in its own class. Within this class, + do the following: +

+
+
+ Use static variables for thread pools +
+
+ You may only want a single instance of a thread pool for your app, in order to have a + single control point for restricted CPU or network resources. If you have different + {@link java.lang.Runnable} types, you may want to have a thread pool for each one, but each + of these can be a single instance. For example, you can add this as part of your + global field declarations: +
+public class PhotoManager {
+    ...
+    static  {
+        ...
+        // Creates a single static instance of PhotoManager
+        sInstance = new PhotoManager();
+    }
+    ...
+
+
+
+ Use a private constructor +
+
+ Making the constructor private ensures that it is a singleton, which means that you don't + have to enclose accesses to the class in a synchronized block: +
+public class PhotoManager {
+    ...
+    /**
+     * Constructs the work queues and thread pools used to download
+     * and decode images. Because the constructor is marked private,
+     * it's unavailable to other classes, even in the same package.
+     */
+    private PhotoManager() {
+    ...
+    }
+
+
+
+ Start your tasks by calling methods in the thread pool class. +
+
+ Define a method in the thread pool class that adds a task to a thread pool's queue. For + example: +
+public class PhotoManager {
+    ...
+    // Called by the PhotoView to get a photo
+    static public PhotoTask startDownload(
+        PhotoView imageView,
+        boolean cacheFlag) {
+        ...
+        // Adds a download task to the thread pool for execution
+        sInstance.
+                mDownloadThreadPool.
+                execute(downloadTask.getHTTPDownloadRunnable());
+        ...
+    }
+
+
+
+ Instantiate a {@link android.os.Handler} in the constructor and attach it to your app's + UI thread. +
+
+ A {@link android.os.Handler} allows your app to safely call the methods of UI objects + such as {@link android.view.View} objects. Most UI objects may only be safely altered from + the UI thread. This approach is described in more detail in the lesson + Communicate with the UI Thread. For example: +
+    private PhotoManager() {
+    ...
+        // Defines a Handler object that's attached to the UI thread
+        mHandler = new Handler(Looper.getMainLooper()) {
+            /*
+             * handleMessage() defines the operations to perform when
+             * the Handler receives a new Message to process.
+             */
+            @Override
+            public void handleMessage(Message inputMessage) {
+                ...
+            }
+        ...
+        }
+    }
+
+
+
+

Determine the Thread Pool Parameters

+

+ Once you have the overall class structure, you can start defining the thread pool. To + instantiate a {@link java.util.concurrent.ThreadPoolExecutor} object, you need the + following values: +

+
+
+ Initial pool size and maximum pool size +
+
+ The initial number of threads to allocate to the pool, and the maximum allowable number. + The number of threads you can have in a thread pool depends primarily on the number of cores + available for your device. This number is available from the system environment: +
+public class PhotoManager {
+...
+    /*
+     * Gets the number of available cores
+     * (not always the same as the maximum number of cores)
+     */
+    private static int NUMBER_OF_CORES =
+            Runtime.getRuntime().availableProcessors();
+}
+
+ This number may not reflect the number of physical cores in the device; some devices have + CPUs that deactivate one or more cores depending on the system load. For these devices, + {@link java.lang.Runtime#availableProcessors availableProcessors()} returns the number of + active cores, which may be less than the total number of cores. +
+
+ Keep alive time and time unit +
+
+ The duration that a thread will remain idle before it shuts down. The duration is + interpreted by the time unit value, one of the constants defined in + {@link java.util.concurrent.TimeUnit}. +
+
+ A queue of tasks +
+
+ The incoming queue from which {@link java.util.concurrent.ThreadPoolExecutor} takes + {@link java.lang.Runnable} objects. To start code on a thread, a thread pool manager takes a + {@link java.lang.Runnable} object from a first-in, first-out queue and attaches it to the + thread. You provide this queue object when you create the thread pool, using any queue class + that implements the {@link java.util.concurrent.BlockingQueue} interface. To match the + requirements of your app, you can choose from the available queue implementations; to learn + more about them, see the class overview for {@link java.util.concurrent.ThreadPoolExecutor}. + This example uses the {@link java.util.concurrent.LinkedBlockingQueue} class: +
+public class PhotoManager {
+    ...
+    private PhotoManager() {
+        ...
+        // A queue of Runnables
+        private final BlockingQueue<Runnable> mDecodeWorkQueue;
+        ...
+        // Instantiates the queue of Runnables as a LinkedBlockingQueue
+        mDecodeWorkQueue = new LinkedBlockingQueue<Runnable>();
+        ...
+    }
+    ...
+}
+
+
+
+

Create a Pool of Threads

+

+ To create a pool of threads, instantiate a thread pool manager by calling + {@link java.util.concurrent.ThreadPoolExecutor#ThreadPoolExecutor ThreadPoolExecutor()}. + This creates and manages a constrained group of threads. Because the initial pool size and + the maximum pool size are the same, {@link java.util.concurrent.ThreadPoolExecutor} creates + all of the thread objects when it is instantiated. For example: +

+
+    private PhotoManager() {
+        ...
+        // Sets the amount of time an idle thread waits before terminating
+        private static final int KEEP_ALIVE_TIME = 1;
+        // Sets the Time Unit to seconds
+        private static final TimeUnit KEEP_ALIVE_TIME_UNIT = TimeUnit.SECONDS;
+        // Creates a thread pool manager
+        mDecodeThreadPool = new ThreadPoolExecutor(
+                NUMBER_OF_CORES,       // Initial pool size
+                NUMBER_OF_CORES,       // Max pool size
+                KEEP_ALIVE_TIME,
+                KEEP_ALIVE_TIME_UNIT,
+                mDecodeWorkQueue);
+    }
+
diff --git a/docs/html/training/multiple-threads/define-runnable.jd b/docs/html/training/multiple-threads/define-runnable.jd new file mode 100644 index 0000000000000..17640a976a984 --- /dev/null +++ b/docs/html/training/multiple-threads/define-runnable.jd @@ -0,0 +1,110 @@ +page.title=Specifying the Code to Run on a Thread + +trainingnavtop=true +@jd:body + +
+
+ + +

This lesson teaches you to

+
    +
  1. Define a Class that Implements Runnable
  2. +
  3. Implement the run() Method +
+ +

You should also read

+ + + +

Try it out

+
+ Download the sample +

ThreadSample.zip

+
+
+ +
+ + +

+ 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 task. +

+

+ {@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. +

+

Define a Class that Implements Runnable

+

+ Implementing a class that implements {@link java.lang.Runnable} is straightforward. For example: +

+
+public class PhotoDecodeRunnable implements Runnable {
+    ...
+    @Override
+    public void run() {
+        /*
+         * Code you want to run on the thread goes here
+         */
+        ...
+    }
+    ...
+}
+
+

Implement the run() Method

+

+ 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 + Communicate with the UI Thread. +

+

+ 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. +

+

+ 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()}. +

+

+ The following snippet shows how to set up the {@link java.lang.Runnable#run run()} method: +

+
+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 the PhotoTask instance,
+         * so that the instance
+         * can interrupt the Thread.
+         */
+        mPhotoTask.setImageDecodeThread(Thread.currentThread());
+        ...
+    }
+...
+}
+
diff --git a/docs/html/training/multiple-threads/index.jd b/docs/html/training/multiple-threads/index.jd new file mode 100644 index 0000000000000..3ea57c51b05c9 --- /dev/null +++ b/docs/html/training/multiple-threads/index.jd @@ -0,0 +1,83 @@ +page.title=Sending Operations to Multiple Threads + +trainingnavtop=true +startpage=true + + +@jd:body + +
+
+ + +

Dependencies and prerequisites

+ + + +

You should also read

+ + +

Try it out

+
+ Download the sample +

ThreadSample.zip

+
+ +
+
+

+ The speed and efficiency of a long-running, data-intensive operation often improves when you + split it into smaller operations running on multiple threads. On a device that has a CPU with + multiple processors (cores), the system can run the threads in parallel, rather than making each + sub-operation wait for a chance to run. For example, decoding multiple image files in order to + display them on a thumbnail screen runs substantially faster when you do each decode on a + separate thread. +

+

+ This class shows you how to set up and use multiple threads in an Android app, using a + thread pool object. You'll also learn how to define code to run on a thread and how to + communicate between one of these threads and the UI thread. +

+

Lessons

+
+
+ Specifying the Code to Run on a Thread +
+
+ Learn how to write code to run on a separate {@link java.lang.Thread}, by + defining a class that implements the {@link java.lang.Runnable} interface. +
+
+ Creating a Manager for Multiple Threads +
+
+ Learn how to create an object that manages a pool of {@link java.lang.Thread} objects and + a queue of {@link java.lang.Runnable} objects. This object is called a + {@link java.util.concurrent.ThreadPoolExecutor}. +
+
+ Running Code on a Thread Pool Thread +
+
+ Learn how to run a {@link java.lang.Runnable} on a thread from the thread pool. +
+
+ Communicating with the UI Thread +
+
+ Learn how to communicate from a thread in the thread pool to the UI thread. +
+
+ diff --git a/docs/html/training/multiple-threads/run-code.jd b/docs/html/training/multiple-threads/run-code.jd new file mode 100644 index 0000000000000..a828828345b06 --- /dev/null +++ b/docs/html/training/multiple-threads/run-code.jd @@ -0,0 +1,148 @@ +page.title=Running Code on a Thread Pool Thread + +trainingnavtop=true +@jd:body + +
+
+ + +

This lesson teaches you to

+
    +
  1. Run a Runnable on a Thread in the Thread Pool
  2. +
  3. Interrupt Running Code
  4. +
+ +

You should also read

+ + + +

Try it out

+
+ Download the sample +

ThreadSample.zip

+
+ +
+
+ +

+ The previous lesson showed you how to define a class that manages thread pools and the tasks + that run on them. This lesson shows you how to run a task on a thread pool. To do this, + you add the task to the pool's work queue. When a thread becomes available, the + {@link java.util.concurrent.ThreadPoolExecutor} takes a task from the queue and runs it on the + thread. +

+

+ This lesson also shows you how to stop a task that's running. You might want to do this if a + task starts, but then discovers that its work isn't necessary. Rather than wasting processor + time, you can cancel the thread the task is running on. For example, if you are downloading + images from the network and using a cache, you probably want to stop a task if it detects that + an image is already present in the cache. Depending on how you write your app, you may not be + able to detect this before you start the download. +

+

Run a Task on a Thread in the Thread Pool

+

+ To start a task object on a thread in a particular thread pool, pass the + {@link java.lang.Runnable} to {@link java.util.concurrent.ThreadPoolExecutor#execute + ThreadPoolExecutor.execute()}. This call adds the task to the thread pool's work queue. When an + idle thread becomes available, the manager takes the task that has been waiting the longest and + runs it on the thread: +

+
+public class PhotoManager {
+    public void handleState(PhotoTask photoTask, int state) {
+        switch (state) {
+            // The task finished downloading the image
+            case DOWNLOAD_COMPLETE:
+            // Decodes the image
+                mDecodeThreadPool.execute(
+                        photoTask.getPhotoDecodeRunnable());
+            ...
+        }
+        ...
+    }
+    ...
+}
+
+

+ When {@link java.util.concurrent.ThreadPoolExecutor} starts a {@link java.lang.Runnable} on a + thread, it automatically calls the object's {@link java.lang.Runnable#run run()} method. +

+

Interrupt Running Code

+

+ To stop a task, you need to interrupt the task's thread. To prepare to do this, you need to + store a handle to the task's thread when you create the task. For example: +

+
+class PhotoDecodeRunnable implements Runnable {
+    // Defines the code to run for this task
+    public void run() {
+        /*
+         * Stores the current Thread in the
+         * object that contains PhotoDecodeRunnable
+         */
+        mPhotoTask.setImageDecodeThread(Thread.currentThread());
+        ...
+    }
+    ...
+}
+
+

+ To interrupt a thread, call {@link java.lang.Thread#interrupt Thread.interrupt()}. Notice that + {@link java.lang.Thread} objects are controlled by the system, which can modify them outside of + your app's process. For this reason, you need to lock access on a thread before you + interrupt it, by placing the access in a synchronized block. For example: +

+
+public class PhotoManager {
+    public static void cancelAll() {
+        /*
+         * Creates an array of Runnables that's the same size as the
+         * thread pool work queue
+         */
+        Runnable[] runnableArray = new Runnable[mDecodeWorkQueue.size()];
+        // Populates the array with the Runnables in the queue
+        mDecodeWorkQueue.toArray(runnableArray);
+        // Stores the array length in order to iterate over the array
+        int len = runnableArray.length;
+        /*
+         * Iterates over the array of Runnables and interrupts each one's Thread.
+         */
+        synchronized (sInstance) {
+            // Iterates over the array of tasks
+            for (int runnableIndex = 0; runnableIndex < len; runnableIndex++) {
+                // Gets the current thread
+                Thread thread = runnableArray[taskArrayIndex].mThread;
+                // if the Thread exists, post an interrupt to it
+                if (null != thread) {
+                    thread.interrupt();
+                }
+            }
+        }
+    }
+    ...
+}
+
+

+ In most cases, {@link java.lang.Thread#interrupt Thread.interrupt()} stops the thread + immediately. However, it only stops threads that are waiting, and will not interrupt CPU or + network-intensive tasks. To avoid slowing down or locking up the system, you should test for + any pending interrupt requests before attempting an operation : +

+
+/*
+ * Before continuing, checks to see that the Thread hasn't
+ * been interrupted
+ */
+if (Thread.interrupted()) {
+    return;
+}
+...
+// Decodes a byte array into a Bitmap (CPU-intensive)
+BitmapFactory.decodeByteArray(
+        imageBuffer, 0, imageBuffer.length, bitmapOptions);
+...
+
diff --git a/docs/html/training/multiple-threads/threadsample.zip b/docs/html/training/multiple-threads/threadsample.zip new file mode 100644 index 0000000000000000000000000000000000000000..bdc3ccfd7040a3068a64d10943c2c5ec9aeace0c GIT binary patch literal 75204 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 literal 0 HcmV?d00001 diff --git a/docs/html/training/training_toc.cs b/docs/html/training/training_toc.cs index e07e669dcbea3..b3e71f6241550 100644 --- a/docs/html/training/training_toc.cs +++ b/docs/html/training/training_toc.cs @@ -907,6 +907,33 @@ +