搜尋
首頁Javajava教程菜鳥初學Java的備忘錄(三)

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

Dec 20, 2016 pm 01:47 PM
java

今天開始學習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
為什麼Java是開發跨平台桌面應用程序的流行選擇?為什麼Java是開發跨平台桌面應用程序的流行選擇?Apr 25, 2025 am 12:23 AM

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

討論可能需要在Java中編寫平台特定代碼的情況。討論可能需要在Java中編寫平台特定代碼的情況。Apr 25, 2025 am 12:22 AM

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

與平台獨立性相關的Java開發的未來趨勢是什麼?與平台獨立性相關的Java開發的未來趨勢是什麼?Apr 25, 2025 am 12:12 AM

Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。

Java的強鍵入如何有助於平台獨立性?Java的強鍵入如何有助於平台獨立性?Apr 25, 2025 am 12:11 AM

Java的強類型系統通過類型安全、統一的類型轉換和多態性確保了平台獨立性。 1)類型安全在編譯時進行類型檢查,避免運行時錯誤;2)統一的類型轉換規則在所有平台上一致;3)多態性和接口機制使代碼在不同平台上行為一致。

說明Java本機界面(JNI)如何損害平台獨立性。說明Java本機界面(JNI)如何損害平台獨立性。Apr 25, 2025 am 12:07 AM

JNI會破壞Java的平台獨立性。 1)JNI需要特定平台的本地庫,2)本地代碼需在目標平台編譯和鏈接,3)不同版本的操作系統或JVM可能需要不同的本地庫版本,4)本地代碼可能引入安全漏洞或導致程序崩潰。

是否有任何威脅或增強Java平台獨立性的新興技術?是否有任何威脅或增強Java平台獨立性的新興技術?Apr 24, 2025 am 12:11 AM

新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

JVM的實現是什麼,它們都提供了相同的平台獨立性?JVM的實現是什麼,它們都提供了相同的平台獨立性?Apr 24, 2025 am 12:10 AM

不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

平台獨立性如何降低發展成本和時間?平台獨立性如何降低發展成本和時間?Apr 24, 2025 am 12:08 AM

平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能