如何停止被BlockingQueue阻塞的線程

如下阻塞隊列+線程的代碼,很常見,當服務停止時,如何停止被BlockingQueue阻塞的線程?

BlockingQueue blockingQueue = new ArrayBlockingQueue(10); final Thread thread = new Thread(new Runnable() { @Override public void run() { while (true) { try { Integer el = blockingQueue.take(); System.out.println(el); } catch (InterruptedException e) { } } } });

方法是當服務停止時,觸發一個操作,給blockingQueue放一個特殊的元素,如上面,傳一個值為-1的元素代表停止事件,線程取到這個特殊元素時就跳出循環:

final int STOP_CODE = -1; BlockingQueue blockingQueue = new ArrayBlockingQueue(10); final Thread thread = new Thread(new Runnable() { @Override public void run() { while (true) { try { Integer el = blockingQueue.take(); // quit loop when receive stop event if (STOP_CODE == el) { break; } //do something useful System.out.println(el); } catch (InterruptedException e) { } } } });