單執行緒的應用程式,就像一條單向車道般,有時候剛好碰到對向車道可能會塞車,可是雙執行緒的應用程式,他就像高速公路般,可以使得你的應用程式非常順暢。
你可以把整個作業系統理解成一家公司,而「執行緒」就是你的員工,你底下有許多位員工,你今天可以派發一件或多件工作給你的員工。
我們以 Android 作為範例(當然也適用於 Java),先從做一件工作開始:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class MainActivity extends Activity {
private Thread __ThreadStudy;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
this.__ThreadStudy = new Thread(__Study);
this.__ThreadStudy.start(); }
private Runnable __Study = new Runnable() { public void run() { for (int i = 0; i < 1000; i++); } }; }
|
不過這樣會面臨一個問題,當這個 Activity 結束時,在執行緒的地方上會發生錯誤,原因是因為 Study 這項工作並沒有結束,我們必須搭配 interrupt,告訴我們的 Study 該休息了:
1 2 3 4 5 6 7 8 9
| @Override protected void onDestroy() { super.onDestroy();
if (this.__ThreadStudy != null) this.__ThreadStudy.interrupt(); }
|
這樣有了工作內容的概念以後,我們接下來要開始思考,如何僱請一位員工,並且開始請這位員工做些事情呢?這時候我們就要動用到 Handler 以及 HandlerThread,你可以把 Handler 想像成你自己,然後 HandlerThread 想像成是你的員工,你必須指派 Thread 工作內容給你的員工:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| public class MainActivity extends Activity {
private Handler __Handler; private HandlerThread __HandlerThread;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
this.__HandlerThread = new HandlerThread("HandlerThread");
this.__HandlerThread.start();
this.__Handler = new Handler(__HandlerThread.getLooper());
this.__Handler.post(__Study); }
private Runnable __Study = new Runnable() { public void run() { for (int i = 0; i < 1000; i++); } };
@Override protected void onDestroy() { super.onDestroy();
if (this.__HandlerThread != null) this.__HandlerThread.removeCallbacks(__Study);
if (this.__Handler != null) this.__Handler.quit(); } }
|
HandlerThread 的基本教學大概就這樣,之後還有 runOnUiThread、Service、Broadcast ... 之類的可以寫 XD