How to interrupt BlockingQueue?

android, blocking, concurrency, interrupt, java

Solution

You need to interrupt the thread that is calling the `queue.put(...);`. The `put(...);` call is doing a `wait()` on some internal condition and if the thread which is calling the `put(...)` gets interrupted, the `wait(...)` call will throw `InterruptedException` which is passed on by the `put(...);`

// interrupt a thread which causes the put() to throw
thread.interrupt();

To get the thread you can either store it when it is created:

Thread workerThread = new Thread(myRunnable);
...
workerThread.interrupt();

or you can use the `Thread.currentThread()` method call and store it somewhere for others to use to interrupt.

public class MyRunnable implements Runnable {
     public Thread myThread;
     public void run() {
         myThread = Thread.currentThread();
         ...
     }
     public void interruptMe() {
         myThread.interrupt();
     }
}

Lastly, it is a good pattern when you catch `InterruptedException` to immediately re-interrupt the thread because when the `InterruptedException` is thrown, the interrupt status on the thread is cleared.

try {
    queue.put(param);
} catch (InterruptedException e) {
    // immediately re-interrupt the thread
    Thread.currentThread().interrupt();
    Log.w(TAG, "put Interrupted", e);
    // maybe we should stop the thread here
}

Problem

BlockingQueue.put can throw InterruptedException. How can I cause the queue to be interrupting by throwing this exception? ``` ArrayBlockingQueue<Param> queue = new ArrayBlockingQueue<Param>(NUMBER_OF_MEMBERS); ... try { queue.put(param); } catch (InterruptedException e) { Log.w(TAG, "put Interrupted", e); } ... // how can I queue.notify? ```

Original source