sleep()使用問題
感謝你無私的奉獻(xiàn),讓我了解到為什么不用不用stop(),推薦的標(biāo)志的方式。
我也想再問一句:為什么不使用sleep()呢。
? 1.我可以在方法中捕捉InterruptedException 時候 處理異常并且用ruturn;
? 2.我看到官方自帶的線程池Exceutor中的shutdownNow也是使用 interrupte()的如下:
java.util.concurrent.ThreadPoolExecutor中的
?private void interruptWorkers() {
??????? final ReentrantLock mainLock = this.mainLock;
??????? mainLock.lock();
??????? try {
??????????? for (Worker w : workers) {
??????????????? try {
??????????????????? w.thread.interrupt();
??????????????? } catch (SecurityException ignore) {
??????????????? }
??????????? }
??????? } finally {
??????????? mainLock.unlock();
??????? }
??? }
我看到網(wǎng)上是說 interrupte()不能中斷IO。
2015-01-08
問題還是回到interrupte()方法的初衷,這個方法是用來向線程發(fā)出中斷請求,而非停止線程的。當(dāng)然很多時候要停止線程就需要先給他一個中斷請求,然后讓線程處理中斷(比如處理InterruptedException)。
在你提到的shutdownNow中,我們看到調(diào)用interruptWorkers()也是這個意思,讓所有的worker線程有機(jī)會處理中斷。緊接著,tryTerminate()回去做停止的工作。
public List<Runnable> shutdownNow() {
? ? ? ? List<Runnable> tasks;
? ? ? ? final ReentrantLock mainLock = this.mainLock;
? ? ? ? mainLock.lock();
? ? ? ? try {
? ? ? ? ? ? checkShutdownAccess();
? ? ? ? ? ? advanceRunState(STOP);
? ? ? ? ? ? interruptWorkers();
? ? ? ? ? ? tasks = drainQueue();
? ? ? ? } finally {
? ? ? ? ? ? mainLock.unlock();
? ? ? ? }
? ? ? ? tryTerminate();
? ? ? ? return tasks;
? ? }