菜鳥初學Java的備忘錄(三) (轉)

worldblog發表於2007-12-15
菜鳥初學Java的備忘錄(三) (轉)[@more@]

年1月17日 星期五 晴
今天開始學習中多執行緒的實現.

執行緒是一些可以並行的,獨立的的程式碼.之前我編的都只能做一件事情,也就是隻有一個執行緒.多執行緒的就是可以將程式任務分成多個並行的子任務,同時執行,互不干擾.我對多執行緒的理解是從格鬥遊戲得來的.格鬥遊戲中兩人對打就是透過兩個執行緒來實現的吧,否則如何能夠你出你的招,我發我的衝擊波呢.

(1月18日)突然想到一個問題,補充一下.多執行緒是不是我們通常所說的多工呢?我的理解是,不能這樣說也可以這樣說.
  簡單說來,多執行緒提供了一種在程式內部進行多個執行緒並行排程的機制,而多工則提供的是在一個操作內部執行多個程式的機制.
  多工(如)的基本原理是這樣的:作業系統將的時間片分配給多個執行緒,每個執行緒在作業系統指定的時間片內完成(注意,這裡的多個執行緒是分屬於不同程式的).作業系統不斷的從一個執行緒的執行切換到另一個執行緒的執行,如此往復,宏觀上看來,就好像是多個執行緒在一起執行.由於這多個執行緒分屬於不同的程式,因此在我們看來,就好像是多個程式在同時執行,這樣就實現了多工.Whs,真繞口.
  如上,多執行緒和多工是有很明顯的區別的.但是再想一下,在一個應用程式內實現多執行緒不也是靠CPU分配時間片嗎?既然原理是相同的,那麼多執行緒也可以說是多工的.


一個Java程式啟動後,就已經有一個執行緒在執行,我們可以透過下面的例子來初步建立一個執行緒的實際印象

class testthread{
  public static void main(String args[]){
  Thread t=Thread.currentThread();
  t.setName("This Thread is running");
  System.out.println("The running thead:"+t);
  try{
  for(int i=0;i<5;i++)
  {
  System.out.println("Sleep time"+i);
  Thread.sleep(1000);//掛起執行緒,就是讓執行緒休息一會兒,不佔用系統資源,因此其它執行緒可以繼續.這裡的Thread預設表示主執行緒
  }
  }catch(InterruptedException e){System.out.println("thread has wrong");}
  }
}


  這只是一個執行緒,那麼我們怎麼實現多個執行緒呢?又怎樣讓執行緒做我安排它要做的事情呢?
  實現執行緒體的構造有兩種方法.
  第一種方法是透過繼承構造執行緒體.
  在Java中專門有一個Thread類,這個類裡面有一個run(),裡面記錄著執行緒要完成的操作,就好像通常所說的主函式main()一樣,run()函式執行完了,執行緒就結束了.透過繼承這個類,我們可以定義我們自己的執行緒,在run函式中告訴它該做什麼事情.下面的程式就是繼承了一個SimpleThread類,用兩個執行緒來輸出HelloWorld.

public class TwoThread{

  public static void main(String args[]){
  new SimpleThread("HelloWorld1").start();//建立兩個執行緒的例項,就這麼簡單
  new SimpleThread("HelloWorld2").start();
  }

}
  class SimpleThread extends Thread{ 正的內容在這裡
  public SimpleThread(String str){
  super(str);//super代表SimpleThread類的直接父類,這裡就是Thread
  }

們要執行緒做的事情都在這裡了
  public void run(){
  for(int i=0;i<10;i++){
  System.out.println(i+" "+getName());
  try{
  sleep((int)(Math.ran()*1000));
  }catch(InterruptedException e){}
  }
  System.out.println("Done!"+getName()); 
  }
}

執行的結果是兩個執行緒交替顯示各自的HelloWorld十次,輸出是混在一起的,因為兩個執行緒是同時執行的.


第二種方法是透過啟動介面構造執行緒體.在任意實現了啟動介面的類當中,比如下面的twothread類,都可以實現多執行緒,我所需要做的就是在這個類的定義當中加上一個run函式.例程如下

class TwoThread implements Runnable{
  TwoThread(){
  Thread t1=Thread.currentThread();
  t1.setName("The first main thread");
  System.out.println("The running thead:"+t1);
  Thread t2=new Thread(this,"the second thread");//注意這裡的this,它表明新執行緒即t2將會做的事情由this來決定,也就是由twothread的run函式來決定
  System.out.println("create another thread");
  t2.start();//該函式將使執行緒從run函式開始執行
  try{
  System.out.println("first thread will sleep");
  Thread.sleep(3000);
  }catch(InterruptedException e){System.out.println("first thread has wrong");}
  System.out.println("first thread exit");
  }

  public void run()//定義run()函式,在本程式中也就是t2這個新的執行緒會做的事情
  {
  try{
  for(int i=0;i<5;i++)
  {
  System.out.println("sleep time for thread 2:"+i);
  Thread.sleep(1000);
  }
  }catch(InterruptedException e){System.out.println("thread has wrong");}
  System.out.println("second thread exit");
  }
  public static void main(String args[]){
  new TwoThread();//觸發建構函式
  }
}

執行的結果如下:
The running rhread:Thread[The first main thread,5,main]
creat another thread
first thread will sleep
Sleep time for thread 2:0
Sleep time for thread 2:1
Sleep time for thread 2:2
first thread exit
Sleep time for thread 2:3
Sleep time for thread 2:4
second thread exit

扯扯別的.我們注意到很多Java程式開頭都有import語句,好像和C的#include和的uses很象哦.import是Java的關鍵詞,負責調入包(package).包由一組類和介面組成,是管理大型名字空間,避免名字衝突的工具.
Java提供了很多包供我們使用,主要如下:

java.applet
設計Applet的類

java.awt
視窗工具包,包含了產生GUI元素的類

java.io
輸入輸出類

java.lang
java語言類,包含:物件,執行緒,異常出口,系統,整數,原點,數字,字元等

java
Socket類及與相關的類

java.util
一些程式的同步類

...
 
  晚上粗略的翻看了一下Java類的概念.作為物件導向程式設計的基本元素,類的思想在Java當中體現的比C++更為突出.不象C++還保持著對程式導向語言的相容,Java的程式裡面只有類,是徹頭徹尾的物件導向,舉個例子,"hello"這個字府串也是一個物件,我們可以呼叫"Hello".equalsIgnoreCase()來判斷它是否和其它字串相同.我們通常在C中看到的主程式Main在Java中也要封裝到類當中,透過類來引用.

  類的基本性質在Java中的體現無非就是過載,繼承和多型.過載是指建立名字相同,引數不同的成員函式,是橫向的.繼承是從祖先類繼承變數和成員函式,是縱向的.多型性舉例說來,體現在程式的執行當中,例項變數可以根據需要選擇以父類的例項出現或以子類的例項出現.

  這些東西多寫寫,給腦袋的刺激會更多些,記得更牢些,免得象上次那樣應聘時,主考官問我物件導向的幾個性質是什麼,我居然都沒能夠答全,真是奇鬱悶啊.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993915/,如需轉載,請註明出處,否則將追究法律責任。

相關文章