歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android開發中的多線程

Android開發中的多線程

日期:2017/3/1 9:39:12   编辑:Linux編程

多線程案例——計時器

這個案例中,屏幕啟動之後,進入如圖所示的界面。

屏幕上有一個文本框用於顯示逝去的時間,此外還有一個“停止計時”按鈕。案例的用例圖如圖所示。

能夠在屏幕上“實時地顯示”時間的流逝,單線程程序是無法實現的,必須要多線程程序才可以實現,即便有些計算機語言可以通過封裝好的類實現這一功能,但從本質上講這些封裝好的類就是封裝了一個線程。

綜上所述,完成本案例用到的知識及技術如下:

  1)進程和線程的概念;

  2)Java中的線程,在Java中創建線程的方式;

  3)Android中的線程,包括:Message、Handler、Looper和HandlerThread等概念。

線程究竟是什麼?在Windows操作系統出現之前,個人計算機上的操作系統都是單任務系統,只有在大型計算機上才具有多任務和分時設計。Windows、Linux操作系統的出現,把原本只在大型計算機才具有的優點,帶到了個人計算機系統中。

進程概念

  一般可以在同一時間內執行多個程序的操作系統都有進程的概念。一個進程就是一個執行中的程序,而每一個進程都有自己獨立的一塊內存空間、一組系統資源。在進程的概念中,每一個進程的內部數據和狀態都是完全獨立的。在Windows操作系統下我們可以通過〈Ctrl+Alt+Del〉組合鍵查看進程,在UNIX和Linux操作系統下是通過PS命令查看進程的。打開Windows當前運行的進程,如圖所示。

在Windows操作系統中一個進程就是一個exe或dll程序,它們相互獨立,互相也可以通信,在Android操作系統中進程間的通信應用也是很多的。

線程概念

  多線程指的是在單個程序中可以同時運行多個不同的線程,執行不同的任務。多線程意味著一個程序的多行語句可以看上去幾乎在同一時間內同時運行。

  線程與進程相似,是一段完成某個特定功能的代碼,是程序中單個順序的流控制。但與進程不同的是,同類的多個線程共享一塊內存空間和一組系統資源,所以系統在各個線程之間切換時,資源占用要比進程小得多,正因如此,線程也被稱為輕量級進程。一個進程中可以包含多個線程。圖所示是計時器程序進程和線程之間的關系,主線程負責管理子線程,即子線程的啟動、掛起、停止等操作。

Android 4.4.4 發布下載 http://www.linuxidc.com/Linux/2014-06/103467.htm

最簡單的Ubuntu Touch & Android 雙系統安裝方式 http://www.linuxidc.com/Linux/2014-01/94881.htm

在Nexus上實現Ubuntu和Android 4.4.2 雙啟動 http://www.linuxidc.com/Linux/2014-05/101849.htm

Ubuntu 14.04 配置 Android SDK 開發環境 http://www.linuxidc.com/Linux/2014-05/101039.htm

64位Ubuntu 11.10下Android開發環境的搭建(JDK+Eclipse+ADT+Android SDK詳細) http://www.linuxidc.com/Linux/2013-06/85303.htm

Ubuntu 14.04 x64配置Android 4.4 kitkat編譯環境的方法 http://www.linuxidc.com/Linux/2014-04/101148.htm

Ubuntu 12.10 x64 安裝 Android SDK http://www.linuxidc.com/Linux/2013-03/82005.htm

Java中的線程

  Java的線程類是java.lang.Thread類。當生成一個Thread類的對象之後,一個新的線程就產生了。Java中每個線程都是通過某個特定Thread對象的方法run()來完成其操作的,方法run( )稱為線程體。

  下面是構建線程類幾種常用的方法:

  public Thread()

  public Thread(Runnable target)

  public Thread(Runnable target, String name)

  public Thread(String name)

  參數target是一個實現Runnable接口的實例,它的作用是實現線程體的run()方法。目標target可為null,表示由本身實例來執行線程。name參數指定線程名字,但沒有指定的構造方法,線程的名字是JVM分配的,例如JVM指定為thread-1、thread-2等名字。

1、Java中的實現線程體方式1

  在Java中有兩種方法實現線程體:一是繼承線程類Thread,二是實現接口Runnable。下面我們先看看繼承線程類Thread方式。

如果采用第1種方式,它繼承線程類Thread並重寫其中的方法 run(),在初始化這個類實例的時候,目標target可為null,表示由本實例來執行線程體。由於Java只支持單重繼承,用這種方法定義的類不能再繼承其他父類,例如代碼清單如圖:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class textThread extends Thread {
boolean flag = true;
int timer = 0;

@Override
public void run() {
super.run();
try {
while (flag) {
this.currentThread().sleep(1000);
timer++;
System.out.print(timer);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
textThread thread = new textThread();
thread.start();
System.out.print("啟動計時器...");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

try {
String line = reader.readLine();
if(line.equalsIgnoreCase("1")){
//thread.stop();
thread.flag = false;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

在main主方法中通過new textThread()創建子線程,並通過thread.start()方法啟動子線程,main主方法所在線程為主線程,主線程負責管理其他的子線程。本例進程、主線程和子線程之間的關系如圖所示。

  子線程啟動之後就開始調用run()方法,run()是一個線程體,我們在子線程中處理事情就是在這裡編寫代碼實現的。本案例中子線程要做的事情就是:休眠1s,計時器加1,再反復執行。Thread.currentThread().sleep(1000)就是休眠1s。

  為了能夠停止線程,我們在主線程中增加了一個標識,通過在控制台輸入一個字符

  “1”來改變該標識t1.isRunning = false,從而結束這個線程。

注意:

  事實上線程中有一個stop()方法也可以停止線程,但是由於這種方法會產生線程死鎖問題,所以在新版JDK中已經廢止了,它的替代解決方法就是增加標識,就是我們在本例中采用的方案。

  很多人覺得線程難理解,主要有兩個問題:

  線程休眠,既然線程已經休眠了,程序的運行速度還能提高嗎?

  線程體一般都進行死循環,既然線程死循環,程序就應該死掉了,就會沒有反應。

  1.關於線程休眠問題

  對線程休眠問題頭痛的讀者,其實還是在用單線程的思維模式考慮問題,多數情況下我們的PC都是單CPU的,某個時間點只能有一個線程運行。所謂多線程就是多個線程交替執行就好像同時運行似的。因此,休眠當前線程可以交出CPU控制權,讓其他的線程有機會運行,多個線程之間只有交替運行效率才是最高的,這就像我們開車過十字路口,只有我等等,讓你先過,你再等等讓他先過,才能保證最高效率,否則就會造成交通系統崩潰,對線程情況也是一樣的。因此,多線程中線程的休眠是程序運行的最有效方式。

  2.關於線程體死循環問題

  在單線程中如果是死循環,程序應就會死掉,沒有反應,但是多線程中線程體(run方法)中的死循環,可以保證線程一直運行,如果不循環線程,則運行一次就停止了。在上面的例子中線程體運行死循環,可以保證線程一直運行,每次運行都休眠1s,然後喚醒,再然後把時間信息輸出到控制台。所以,線程體死循環是保證子線程一直運行的前提。由於是子線程它不會堵塞主線程,就不會感覺到程序死掉了。但是需要注意的是有時我們確實執行一次線程體,就不需要循環了。

 程序運行後開始啟動線程,線程啟動後就計算逝去的時間,每過1s將結果輸出到控制台。當輸入1字符後線程停止,程序終止。如圖所示。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-09/107376p2.htm

Copyright © Linux教程網 All Rights Reserved