首頁 >Java >java教程 >菜鳥初學Java的備忘錄(三)

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

黄舟
黄舟原創
2016-12-20 13:47:551115瀏覽

今天開始學習java中多執行緒的實作.

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

(1月18日)忽然想到一個問題,補充一下.多線程是不是我們通常所說的多任務呢?我的理解是,不能這樣說也可以這樣說.
簡單說來,多線程提供了一種在進程內部進行多個線程並行調度的機制,而多任務則提供的是在一個操作系統內部運行多個進程的機制.
多任務作業系統(如Windows)的基本原理是這樣的:作業系統將CPU的時間片分配給多個執行緒,每個執行緒在作業系統指定的時間片內完成(注重,這裡的多個執行緒是分屬於不同進程的).作業系統不斷的從一個線程的執行切換到另一個線程的執行,如此往復,宏觀上看來,就似乎是多個線程在一起執行.由於這多個線程分屬於不同的進程,因此在我們看來,就似乎是多個進程在同時執行,這樣就實現了多任務.Whoops,真繞口.
如上,多線程和多任務是有很明顯的區別的.但是再想一下,在一個應用程式內實現多線程不也是靠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{
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{ file://真正的內容在這裡
public SimpleThread(String str){
super(str);//super代表SimpleThread類別的直接父類,這裡就是Thread
}

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

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

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

class TwoThread implements Runnable{
TwoThread(){
Thread t1=Thread.currentThread();
t11 .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{
System.out.println("sleep time for thread 2:"+i);
Thread.sleep(1000);
}
}catch(InterruptedException eceptception 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
creat another thread
first thread will sleep 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 ex Java程式開頭都有import語句,似乎和C的#include和Delphi的uses很像哦.import是Java的要害詞,負責調入包(package).包由一組類和界面組成,是治理大型名字空間,避免名字衝突的工具.
Java提供了許多套件供我們使用,主要如下:

java.applet
設計Applet的類別

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

java.io
檔輸入輸出類

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

java.net
Socket類及與TCP/ip相關的類別

java.util
一些程式的同步類別

...

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

類別的基本性質在Java中的體現無非就是重載,繼續和多態.重載是指創建名字相同,參數不同的成員函數,是橫向的.繼續是從祖先類繼續變量和成員函數,是縱向的.多態性舉例說來,體現在程式的運行當中,實例變數可以根據需要選擇以父類的實例出現或以子類的實例出現.

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

 以上就是菜鳥初學Java的備忘錄(三)的內容,更多相關內容請關注PHP中文網(www.php.cn)! 

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn