Run執行緒(阻塞執行緒) 如何關閉
阿新 • • 發佈:2018-12-24
不能使用 stop 方法 暴力關閉 執行緒
而要使用Interrupted()方法 但是這個方法並非真正的關閉執行緒了,而是做了一箇中斷標記 當呼叫isInterrupted() 值會發生改變。
但是這種思路是針對 非阻塞執行緒的, 對於阻塞執行緒(sleep wait )並不會 成功 ,而是會丟擲個InterruptedException 。
阻塞執行緒 呼叫isAlive 方法 返回值也是False
所以我們的解決思路是:
1.呼叫 interrupted方法
2.對於阻塞執行緒就 catch Exception
//中斷阻塞異常 拋異常 !!! lunborunnable=new Runnable() { @Override public void run() { Boolean isrun=true; try { lunbothread.sleep(1500); while (isrun) { Log.d("homeview","::"+lunbothread.currentThread().isInterrupted()); if (lunbothread.currentThread().isInterrupted()) { return; } if (handler != null) { try { lunbothread.sleep(2000); Message lunbo_ms = handler.obtainMessage(); lunbo_ms.what = 2; lunbo_ms.sendToTarget(); } catch (InterruptedException e) { e.printStackTrace(); return; } Log.d("is execute?", "handler?"); } else { Log.d("handlernull", "handler?"); } } } catch (InterruptedException e) { e.printStackTrace(); } } }; lunbothread=new Thread(lunborunnable); lunbothread.start();
if(homepagerView.lunbothread!=null){ Log.d("lunbothread","main isinterrupted? :"+ homepagerView.lunbothread.isAlive()); homepagerView.lunbothread.interrupt(); Log.d("lunbothread","main isinterrupted? :"+homepagerView.lunbothread.isInterrupted()); } else { Log.d("lunbothread","null"); }