程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> J2ME中實現多線程技術總結

J2ME中實現多線程技術總結

編輯:關於JAVA

我們知道,在操作系統級別上軟件的運行一般都是以進程為單位,而在每個進程的運行過程中允許同時並發執行多個不同線程,這就使得一個程序能同時執行不同的操作。使用多線程的目的是為了最大限度地利用計算機CPU資源。JAVA程序字節碼最終是在JVM虛擬機下運行的,同一虛擬機進程中的不同操作都是通過多線程來運行的。在Java虛擬機中,線程常用有單線程和多線程,單線程指程序執行過程只是一個有效操作的序列,不同操作都有著明確的先後順序;而多線程允許同時進行著不同的操作,這些不同的操作同時並發進行著,並由CPU時鐘頻率根據不同的調度方式對他們進行執行調度。

    在Java語言中提供了豐富的多線程操縱接口,提供了各類不同的線程實現方法供我們選擇,功能非常強大。在手機軟件設計中,由於同樣需要執行網絡連接(基於HTTP的高級Internet協議通訊)、UI調度等待、UI顯示幻化、游戲控制等操作需要通過後台的數據運算或UI不斷更新等操作。因此在J2ME中,KVM虛擬機也提供了功能強大的多線程API,使我們同樣能在J2ME中實現線程的並發運算。

    在J2ME中,主要有以下三種方法實現多線程。

    一、繼承Thread類(Java.lang.Thread)

    通過編寫線程類繼承Thread類並重寫Thread類中的run()方法實現線程,當線程對象被運行時候將會自動執行run方法中的實體內容,從而開辟一個單獨的線程並運行起來。

         如:public class ThreadSimple extends Thread{
                  public ThreadSimple()
                  {
                        //constructor
                   }
                  public void run()
                  {
                        //run code entity
                  }
         }

    線程實例使用,直接創建對象並調用start()方法即可運行線程。

    new ThreadSimple()。start();當執行start方法時候,將會自動運行run方法,但是執行start方法時候只做了一件事,就是將線程轉化為可執行狀態,然後等待操作系統進行調度並運行,因此無法保證線程能立即啟動。在Java中,Thread類實現了Runnable接口,因此run方法是通過實現接口Runnable中的抽象方法。

    二、直接實現Runnable多線程接口(Java.lang.Runnable)

    線程接口Runnable中只有一個抽象方法run,通過實現Runnable接口中的方法的類即可創建出有多線程特征的對象,但該對象並無法使其啟動線程,需要作為參數並借助Thread的構造方法構造創建對象並調用start方法對線程進行啟動。

         如:public class RunnablSimple implements Runnable{
                  public RunnableSimple()
                  {
                         //constructor
                  }
                  public void run(){
                        //run code entity
               }
      }

    實現類型的對象使用:

    RunnableSimple rs = new RunnableSimple();

    new Thread(rs).start();

    由此可見,以上兩種方法都是通過Thread的start來啟動線程的,實際上所有的線程操作都是封裝在Thread這個類中,由Thread對象調用各種接口來控制線程。

    J2ME中線程中主要方法:void setPriority(int newPriority),設置線程優先級,在操作系統中線程的調度是不確定性的,可以通過該方法設置相應線程的優先級別。

    static void sleep(long millis) ,線程中靜態方法,用於讓線程進入休眠狀態,執行該方法將會讓線程在指定時間millis毫秒內休眠。

    void start(),使現在進入可執行狀態。

    void run() ,線程執行主體。

    void join(),等待該線程終止。

    boolean isAlive(),用於判斷線程是否出於Alive狀態。

    static void yIEld() ,盡量讓其他線程先執行。

三、使用任務組合實現多線程

    在J2ME中,同樣具有Java中的任務處理組合類,他們分別為Timer和TimerTask,可以使用他們實現多線程,簡單說就是定時實現任務。

    Timer是Java中的一個定時器,可以實現在某一時間做某件事或者在某一時間段做某些事,分別通過方法schedule(TimerTask tt,long millis)和schedule(TimerTask tt,long start,long off)。

    TimerTask是一個任務類,通過繼承該類並覆蓋方法run即可創建一個任務。

      如:public class TimerTaskS extends TimerTask{
               public TimerTaskS(){
                     //constructor
               }
               public void run(){
                    //run code entity
         }
      }

    任務調用:

    Timer timer = new Timer();

    //3秒鐘後執行任務

    timer.schedule(new TimerTaskS(),3000);

    //3秒鐘後執行任務並且之後每5秒鐘執行一次

    timer.schedule(new TimerTaskS(),3000,5000);

    有此可見在使用計時任務可以達到實現線程的效果,分別執行不同的並發操作,通過Timer類對象來操作TimerTask對象,通過schedule方法來計時執行任務,在結束任務的時候,通常使用cancel()來實現。

    通常情況下,在J2ME軟件中我們通過手機按鍵來觸發一系列相應的操作,在程序響應處理過程中較多會涉及網絡操作、數據存儲等相對消耗時間和資源的操作,而這些操作往往需要一定的時間才能完成,因此在處理按鍵響應過程中通常我們需要建立線程處理,避免程序出現死機現象。

      public void commandAction(Command c, Displayable s) {
 if(c==do1Com){
  //創建實現接口線程
  new Thread(new RunnableSimple()).start();
 }
 else if(c==do2Com){
  //創建繼承Thread線程
        new ThreadSimple().start();
 }
     else{
       //創建任務線程
       new Timer().schedule(new TimerTaskS(),3000,20);
   }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved