1. 程式人生 > >Android Java 執行緒暫停與繼續

Android Java 執行緒暫停與繼續

 突然碰到一個問題,執行緒的暫停與繼續,我想了想,去使用JDK給我們提供的suspend方法、interrupt方法??suspend()方法讓這個執行緒與主執行緒都暫停了,誰來喚醒他們??明顯這個不好用,要用的話,恐怕得另寫喚醒執行緒了!interrupt方法,這個方法實際上只能中斷當前執行緒!汗!

        既然JDK解決不了偶的問題,偶只能自己寫了!

        這個時候想到了Object的wait()和notifyAll()方法。使用這兩個方法讓執行緒暫停,並且還能恢復,我只需要封裝一下,就能夠變成非常之好用的程式碼了!如下請看:

        我新建Thread類繼承MyThread只需實現runPersonelLogic()即可跑你自己的邏輯啦!!!

        另外呼叫setSuspend(true)是當前執行緒暫停/ 等待,呼叫setSuspend(false)讓當前執行緒恢復/喚醒!自我感覺很好使!

  1. publicabstractclass MyThread extends Thread {  
  2.     privateboolean suspend = false;  
  3.     private String control = ""// 只是需要一個物件而已,這個物件沒有實際意義
  4.     publicvoid setSuspend(boolean suspend) {  
  5.         if (!suspend) {  
  6.             synchronized (control) {  
  7.                 control.notifyAll();  
  8.             }  
  9.         }  
  10.         this.suspend = suspend;  
  11.     }  
  12.     publicboolean isSuspend() {  
  13.         returnthis.suspend;  
  14.     }  
  15.     publicvoid run() {  
  16.         while (true) {  
  17.             synchronized (control) {  
  18.                 if (suspend) {  
  19.                     try {  
  20.                         control.wait();  
  21.                     } catch (InterruptedException e) {  
  22.                         e.printStackTrace();  
  23.                     }  
  24.                 }  
  25.             }  
  26.             this.runPersonelLogic();  
  27.         }  
  28.     }  
  29.     protectedabstractvoid runPersonelLogic();  
  30.     publicstaticvoid main(String[] args) throws Exception {  
  31.         MyThread myThread = new MyThread() {  
  32.             protectedvoid runPersonelLogic() {  
  33.                 System.out.println("myThead is running");  
  34.             }  
  35.         };  
  36.         myThread.start();  
  37.         Thread.sleep(3000);  
  38.         myThread.setSuspend(true);  
  39.         System.out.println("myThread has stopped");  
  40.         Thread.sleep(3000);  
  41.         myThread.setSuspend(false);  
  42.     }  
  43. }