菜鳥初學Java的備忘錄(三) (轉)
年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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 菜鳥初學Java的備忘錄(二) (轉)Java
- 菜鳥初學Java的備忘錄(五) (轉)Java
- 菜鳥初學Java的備忘錄(八) (轉)Java
- 菜鳥初學Java的備忘錄(七) (轉)Java
- 菜鳥初學Java的備忘錄(九) (轉)Java
- 菜鳥初學Java的備忘錄(四) (轉)Java
- 菜鳥初學Java的備忘錄(六) (轉)Java
- 菜鳥初學Java的備忘錄(十) (轉)Java
- 菜鳥初學Java的備忘錄(一) (轉)Java
- 初學Java的備忘錄Java
- 【備忘】Java菜鳥到大牛學習路線之實戰篇Java
- 【菜鳥學Java】2:初識J2EEJava
- Java備忘錄《集合》Java
- 菜鳥學Java(十七)——Jboss瘦身Java
- 菜鳥學Java(十八)——異常Java
- 菜鳥學習SQL注射(轉)SQL
- 菜鳥學Java(九)——Servlet的基本配置JavaServlet
- 菜鳥學Java(三)——JSTL標籤之核心標籤JavaJS
- Java備忘錄《“==” 和 “equals”》Java
- Linux C++ 自學筆記之二<菜鳥初學系列> (轉)LinuxC++筆記
- 菜鳥學Java(十六)——Jboss簡介Java
- 菜鳥學Java(十一)——GET與POSTJava
- 【菜鳥學Java】11:Session技術JavaSession
- 【菜鳥學Java】10:Cookie技術JavaCookie
- 【菜鳥學Java】4:Servlet 技術JavaServlet
- linux技術備忘錄三 Java環境變數設定(轉)LinuxJava變數
- Dart 學習備忘錄Dart
- 菜鳥學Java(十四)——Java反射機制(一)Java反射
- 菜鳥學Java(十五)——Java反射機制(二)Java反射
- 菜鳥學堂之破解Sessioncookie的方法(轉)SessionCookie
- 菜鳥學Java(十)——分頁查詢Java
- IT菜鳥的學習生活
- EJB菜鳥入門三板斧:) (轉)
- 【菜鳥學Java】7:JSP的基本語法JavaJS
- java菜鳥入門Java
- 菜鳥學資料庫(五)——MySQL必備命令資料庫MySql
- 備忘錄
- 【備忘錄】