資源描述:
《Java并發(fā)編程線程入門(mén)簡(jiǎn)介》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、Java并發(fā)編程:線程?????從一開(kāi)始Java就被設(shè)計(jì)成支持并發(fā)編程的語(yǔ)言,java語(yǔ)言及其核心類(lèi)庫(kù)都有對(duì)并發(fā)編程的支持。從5.0開(kāi)始,Java平臺(tái)引入了一些高層的并發(fā)接口。本系列文章將盡可能的概括這些內(nèi)容?! ∵M(jìn)程與線程 并發(fā)編程模式中,有兩個(gè)基本執(zhí)行單元:進(jìn)程與線程。進(jìn)程和線程是現(xiàn)代操作系統(tǒng)的基本概念。一個(gè)進(jìn)程擁有獨(dú)立完備的執(zhí)行環(huán)境,進(jìn)程擁有私有的計(jì)算機(jī)資源,比如獨(dú)立的內(nèi)存空間、代碼段、指令寄存器等等。進(jìn)程在操作系統(tǒng)中基本等同于應(yīng)用程序。最終用戶(hù)看到的獨(dú)立程序有可能是多個(gè)互相協(xié)作的進(jìn)程,為了方便進(jìn)程之間的通信,大多數(shù)操作系統(tǒng)支持進(jìn)程間通信(InterProcessCommun
2、ication,IPC)資源,比如管道和端口。IPC往往不僅僅在同一臺(tái)計(jì)算機(jī)系統(tǒng)上使用,也往往運(yùn)用于不同計(jì)算機(jī)系統(tǒng)之間的通信?! 【€程通常也稱(chēng)輕量級(jí)進(jìn)程,線程擁有的資源比進(jìn)程的要少。線程只存在于進(jìn)程中,一個(gè)進(jìn)程可以包含多個(gè)線程。比如一個(gè)Java程序中可以有多個(gè)線程存在。線程不擁有獨(dú)立的內(nèi)存空間,而是和同進(jìn)程內(nèi)的其他線程共享進(jìn)程的內(nèi)存空間。由于線程共享進(jìn)程的資源(內(nèi)存或者打開(kāi)的文件),同進(jìn)程的線程之間往往需要大量的互斥和同步,保證資源使用的可確定性。這在前面文章中已經(jīng)說(shuō)過(guò),資源共享是并發(fā)編程中同步和互斥的根源?! ∮捎谶M(jìn)程的特性,使得它們之間資源共享的沖突比較少,因此并發(fā)編程主要是針對(duì)
3、線程的,多線程編程是Java程序的基本特征。因此這兒講的并發(fā)編程主要是針對(duì)Java線程編程的。 Java線程 簡(jiǎn)單來(lái)說(shuō),每個(gè)Java線程都有一個(gè)Thread實(shí)例與之對(duì)應(yīng)。創(chuàng)建線程對(duì)象的方法通常有兩種: 1.直接創(chuàng)建和管理,也就是每當(dāng)程序需要異步執(zhí)行任務(wù)時(shí)就實(shí)例化一個(gè)Thread對(duì)象,然后自己管理其生命周期?! ?.抽象線程管理,使其從程序代碼中分離開(kāi)來(lái)。這些接口在java5之后的java.util.concurrency包中提供?! ∥覀兿扔懻摰谝环N方式,java.util.concurrency包提供的高層工具我們?cè)诤竺娴奈恼略儆懻摗! 〉谝环N方式創(chuàng)建線程非常直接,有兩種方法
4、可以創(chuàng)建一個(gè)線程實(shí)例: 1.生成一個(gè)Runnable對(duì)象,并將它傳遞給Thread對(duì)象。1publicclassHelloWorldimplementsRunnable{2????publicvoidrun(){3????????System.out.println("HelloWorld");4????}5????publicstaticvoidmain(Stringargs[]){6????????(newThread(newHelloWorld())).start();7????}8}9 2.繼承Thread并實(shí)現(xiàn)其run方法:1publicclassHelloThread
5、extendsThread{2????publicvoidrun(){3????????System.out.println("HelloWorld!");4????}5????publicstaticvoidmain(Stringargs[]){6????????(newHelloThread()).start();7????}8}9???????如何選擇使用哪種方式呢?第一種模式更為通用,實(shí)現(xiàn)一個(gè)Runnable接口允許你繼承并復(fù)用某類(lèi)。第二種更簡(jiǎn)單,缺點(diǎn)是必須繼承Thread。你可以根據(jù)具體情況選擇。 Thread對(duì)象中定義了一些有用的方法來(lái)管理線程的生命周期: 1.pub
6、licstaticvoidsleep(longmillis)throwsInterruptedException方法,該方法掛起當(dāng)前線程一段時(shí)間,主動(dòng)讓出處理器讓其他線程使用。sleep方法還可以用來(lái)控制執(zhí)行的速度。注意這個(gè)方法在掛起線程時(shí),有可能被其他線程中斷掛起,因此不能依賴(lài)其時(shí)間參數(shù)來(lái)定時(shí)?! ?.publicvoidinterrupt()方法,該方法中斷某線程正在做的事情,告訴它某些事情發(fā)生了需要處理。程序員需要捕捉這個(gè)中斷異常,并在異常處理中執(zhí)行應(yīng)該做的動(dòng)作。接受中斷的方式有兩種,一種是被中斷線程目前正在執(zhí)行一個(gè)能拋出InterruptedException的方法,比如sl
7、eep或者Object.wait等方法,還比如一些可以被interrupted的SeverSocket.accept方法等等。下面是示例代碼:1for(inti=0;i