Java 實現執行緒的暫停,繼續,等功能實現
前言
這幾天的專案中,客戶給了個需求,希望我可以開啟一個任務,想什麼時候暫停就什麼時候暫停,想什麼時候開始就什麼時候開始!所以這幾天惡補了一下執行緒中的方法,記錄一下,並給大家分享一下
正文
自定義執行緒類(MyThread)
package com.example.wangjun.myapplication; import android.util.Log; public class MyThread extends Thread { private final Object lock = new Object(); private boolean pause = false; /** * 呼叫該方法實現執行緒的暫停 */ void pauseThread(){ pause = true; } /* 呼叫該方法實現恢復執行緒的執行 */ void resumeThread(){ pause =false; synchronized (lock){ lock.notify(); } } /** * 這個方法只能在run 方法中實現,不然會阻塞主執行緒,導致頁面無響應 */ void onPause() { synchronized (lock) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } @Override public void run() { super.run(); int index = 0; while(true){ while (pause){ onPause(); } try { System.out.println(index); Thread.sleep(50); ++index; }catch (Exception e){ e.printStackTrace(); break; } } } }
上面程式碼中,有註釋,其實大家應該都看得懂,那麼主要是我們使用同步鎖synchronized
對Objecy
型別的lock
進行同步,並在OnPause()
方法中進行wait()
方法,執行緒等待,又在resumeThread()
方法中進行了解鎖notify()
,所以我們就能進行執行緒的暫停和繼續的操作了
方法的呼叫
MyThread my = new MyThread(); Thread thread = new Thread(my); thread.start(); try { sleep(1000); my.pauseThread(); sleep(5000); my.resumeThread(); } catch (InterruptedException e) { e.printStackTrace(); }
出現的結果,會在前一秒內瘋狂自增,之後在聽五秒後,又開始繼續自增;
最後
目前只是簡單的執行緒暫停和繼續,希望大家可以根據這個基礎進行相應的調整和深入,謝謝大家!!!