版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第11章并發(fā)11.1線程的創(chuàng)建與啟動(dòng)11.2線程的狀態(tài)轉(zhuǎn)換11.3線程調(diào)度11.4后臺(tái)線程11.7綜合實(shí)例11.5線程互斥11.6線程同步11.1線程的創(chuàng)建與啟動(dòng)11.1.1繼承java.lang.Thread類Thread類代表線程類,它的常用方法如下:staticThreadcurrentThread():返回當(dāng)前正在運(yùn)行的線程對(duì)象的引用。staticvoidyield():暫停當(dāng)前正在運(yùn)行的線程對(duì)象,并運(yùn)行其他線程。staticvoidsleep(longmillis)throwsInterruptedException:在指定的毫秒數(shù)內(nèi)讓當(dāng)前正在運(yùn)行的線程休眠(暫停執(zhí)行),此操作受到系統(tǒng)計(jì)時(shí)器和調(diào)度程序精度和準(zhǔn)確性的影響。該線程不執(zhí)行釋放對(duì)象鎖的操作。millis表示以毫秒為單位的休眠時(shí)間。voidstart():使該線程開始運(yùn)行,Java虛擬機(jī)調(diào)用該線程的run()方法,該線程與其他線程并發(fā)執(zhí)行。voidrun():如果該線程是使用實(shí)現(xiàn)Runnable接口的對(duì)象構(gòu)造的,則調(diào)用該Runnable對(duì)象的run()方法;否則,該方法不執(zhí)行任何操作并返回。Thread的子類應(yīng)該重寫該方法。voidinterrupt():設(shè)置線程的中斷標(biāo)記位,請(qǐng)求線程停止運(yùn)行。finalvoidsetPriority(intnewPriority):更改線程的優(yōu)先級(jí)。finalintgetPriority():返回線程的優(yōu)先級(jí)。11.1.1繼承java.lang.Thread類finalvoidsetName(Stringname):改變線程名稱,使之與參數(shù)name相同。finalStringgetName():返回該線程的名稱。finalvoidjoin()throwsInterruptedException:等待該線程終止。finalvoidsetDaemon(booleanon):將該線程標(biāo)記為守護(hù)線程或用戶線程。當(dāng)正在運(yùn)行的線程都是守護(hù)線程時(shí),Java虛擬機(jī)退出。該方法必須在啟動(dòng)線程前調(diào)用。 longgetId():返回該線程的標(biāo)識(shí)符。線程ID是一個(gè)正的長整型數(shù),在創(chuàng)建該線程時(shí)生成。線程ID是唯一的,在線程終止之前一直保持不變。線程終止后,該線程ID可以被重新使用。
用戶的線程類只需要繼承Thread類,并重寫Thread類的run()方法即可。通過調(diào)用用戶線程類的start()方法即可啟動(dòng)該線程。 【例11.1】繼承Thread類實(shí)現(xiàn)多線程。11.1.2實(shí)現(xiàn)Runnable接口另一種創(chuàng)建線程的方式是實(shí)現(xiàn)java.lang.Runnable接口,它只有一個(gè)run()方法。當(dāng)使用Thread(Runnablethread)方式創(chuàng)建線程對(duì)象時(shí),需為該方法傳遞一個(gè)實(shí)現(xiàn)了Runnable接口的對(duì)象,這樣創(chuàng)建的線程將調(diào)用實(shí)現(xiàn)Runnable接口的對(duì)象的run()方法?!纠?1.2】實(shí)現(xiàn)Runnable接口實(shí)現(xiàn)多線程。11.2線程的狀態(tài)轉(zhuǎn)換1.新建狀態(tài)(New)用new操作符創(chuàng)建一個(gè)線程對(duì)象時(shí),例如用newThread(t),線程還沒有開始運(yùn)行。此時(shí)線程處在新建(new)狀態(tài)。當(dāng)一個(gè)線程處在新建狀態(tài)時(shí),程序還沒有開始運(yùn)行線程中的代碼。在線程可以運(yùn)行之前,還有一些工作要做。2.就緒狀態(tài)(Runnable)當(dāng)一個(gè)線程對(duì)象創(chuàng)建后,其他線程調(diào)用它的start()方法,該線程就進(jìn)入就緒狀態(tài)。在這種狀態(tài)下,只要調(diào)度器把時(shí)間片分配給線程,線程就可以運(yùn)行。也就是說,在任意時(shí)刻,線程可以運(yùn)行也可以不運(yùn)行,這不同于死亡狀態(tài)和阻塞狀態(tài)。Java虛擬機(jī)為它創(chuàng)建方法調(diào)用棧和程序計(jì)數(shù)器。處于這個(gè)狀態(tài)的線程位于可運(yùn)行池中,等待獲得CPU的使用權(quán)。Java不區(qū)分就緒態(tài)和運(yùn)行態(tài)。11.2線程的狀態(tài)轉(zhuǎn)換3.阻塞狀態(tài)(Blocked)阻塞狀態(tài)是指線程因?yàn)槟承┰蚍艞塁PU,暫時(shí)停止運(yùn)行。當(dāng)線程處于阻塞狀態(tài)時(shí),Java虛擬機(jī)不會(huì)給線程分配CPU,直到線程重新進(jìn)入就緒狀態(tài),它才有機(jī)會(huì)得到運(yùn)行。例如,一個(gè)線程使用同步socket操作讀取網(wǎng)絡(luò)數(shù)據(jù),而恰恰此時(shí)網(wǎng)絡(luò)繁忙,或者遠(yuǎn)方主機(jī)無法響應(yīng),那么該線程必定會(huì)由于等待遠(yuǎn)端主機(jī)發(fā)送數(shù)據(jù)包而進(jìn)入阻塞狀態(tài);或者,在線程體內(nèi)調(diào)用了同步對(duì)象的wait()方法,線程也會(huì)進(jìn)入阻塞狀態(tài)。一個(gè)線程進(jìn)入阻塞狀態(tài)可能有如下原因:通過調(diào)用sleep(milliseconnds)使線程進(jìn)入休眠狀態(tài),線程在指定的時(shí)間內(nèi)不會(huì)運(yùn)行。 (2) 通過調(diào)用wait()方法使線程掛起,直到線程得到了notify()或notifyAll()消息,線程才會(huì)進(jìn)入就緒狀態(tài)。 (3) 線程在等待某個(gè)輸入、輸出完成。 (4) 線程試圖在某個(gè)對(duì)象上調(diào)用同步控制方法,但是對(duì)象鎖不可用,因?yàn)榱硪粋€(gè)對(duì)象已經(jīng)獲取了這個(gè)鎖。
【例11.3】調(diào)用sleep()方法使主線程睡眠,進(jìn)入阻塞狀態(tài),讓客戶線程得到CPU。11.2線程的狀態(tài)轉(zhuǎn)換4.死亡狀態(tài)(Dead)當(dāng)線程退出run()方法時(shí),就進(jìn)入死亡狀態(tài),該線程結(jié)束生命周期。線程有可能是正常執(zhí)行完run()方法而退出,也有可能是遇到異常而退出run()方法。11.3線程調(diào)度如果希望明確地讓一個(gè)線程給另一個(gè)線程運(yùn)行的機(jī)會(huì),可以采取以下辦法之一:調(diào)整各個(gè)線程的優(yōu)先級(jí)。讓處于運(yùn)行狀態(tài)的線程調(diào)用Thread.sleep()方法。讓處于運(yùn)行狀態(tài)的線程調(diào)用Thread.yield()方法。讓處于運(yùn)行狀態(tài)的線程調(diào)用另一個(gè)線程的join()方法。11.3.1調(diào)整各個(gè)線程的優(yōu)先級(jí)所有處于就緒狀態(tài)的線程根據(jù)優(yōu)先級(jí)存放在可運(yùn)行池中,優(yōu)先級(jí)低的線程獲得較少的運(yùn)行機(jī)會(huì),優(yōu)先級(jí)高的線程獲得較多的運(yùn)行機(jī)會(huì)。Thread類的setPriority(int)和getPriority()方法分別用來設(shè)置優(yōu)先級(jí)和讀取優(yōu)先級(jí)。優(yōu)先級(jí)用整數(shù)表示,取值范圍是1~10,Thread類有以下3個(gè)靜態(tài)常量。MAX_PRORITY:取值為10,表示最高優(yōu)先級(jí)。MIN_PRIORITY:取值為1,表示最低優(yōu)先級(jí)。NORM_PRIORITY:取值為5,表示默認(rèn)的優(yōu)先級(jí)?!纠?1.4】調(diào)整線程的優(yōu)先級(jí),調(diào)整線程對(duì)象t2的優(yōu)先級(jí)為最高級(jí)。11.3.2線程讓步當(dāng)前運(yùn)行的線程調(diào)用yield()方法,使它暫時(shí)放棄CPU,給其他線程一個(gè)執(zhí)行的機(jī)會(huì),但當(dāng)前線程仍處于運(yùn)行態(tài),這是因?yàn)镴ava中沒有進(jìn)一步區(qū)分運(yùn)行態(tài)與就緒態(tài)。線程調(diào)用yield(),并不一定保證它會(huì)放棄CPU給其他線程。Java的線程調(diào)度器根據(jù)調(diào)度算法,仍可能使它繼續(xù)占用CPU運(yùn)行。若該線程的優(yōu)先級(jí)高,即使它調(diào)用yield(),低優(yōu)先級(jí)的線程仍不會(huì)占用CPU運(yùn)行。因?yàn)閥ield()方法只給相同或更高優(yōu)先級(jí)的線程以執(zhí)行的機(jī)會(huì),如果當(dāng)前系統(tǒng)中沒有相同或更高優(yōu)先級(jí)的線程,該方法調(diào)用不會(huì)產(chǎn)生任何效果,當(dāng)前線程繼續(xù)執(zhí)行?!纠?1.5】當(dāng)前線程調(diào)用yield()方法暫時(shí)放棄CPU,給其他線程運(yùn)行的機(jī)會(huì)。sleep()方法和yield()方法都是Thread()類的靜態(tài)方法,都會(huì)使當(dāng)前處于運(yùn)行狀態(tài)的線程放棄CPU,把運(yùn)行機(jī)會(huì)讓給別的線程。兩種的區(qū)別在于:(1) sleep()方法會(huì)給其他線程運(yùn)行的機(jī)會(huì),而不考慮其他線程的優(yōu)先級(jí),因此會(huì)給較低優(yōu)先級(jí)線程一個(gè)運(yùn)行的機(jī)會(huì);yield()方法只會(huì)給相同優(yōu)先級(jí)或者更高優(yōu)先級(jí)的線程一個(gè)運(yùn)行的機(jī)會(huì)。(2)當(dāng)線程執(zhí)行了sleep(longmillis)方法后,將轉(zhuǎn)到阻塞狀態(tài),參數(shù)millis指定睡眠時(shí)間;當(dāng)線程執(zhí)行了yield()方法后,線程仍處于可就緒態(tài)。11.3.3合并線程一個(gè)線程可以在其他線程上調(diào)用join()方法,則當(dāng)前運(yùn)行的線程將被掛起,直到目標(biāo)線程運(yùn)行結(jié)束,它才恢復(fù)運(yùn)行。也可以在調(diào)用join()方法時(shí)帶上一個(gè)超時(shí)參數(shù),這樣如果目標(biāo)線程在這段時(shí)間到期時(shí)還沒有結(jié)束的話,join()方法總能返回。【例11.6】主線程調(diào)用了客戶線程的join()方法,主線程將等到客戶線程運(yùn)行結(jié)束后,才會(huì)恢復(fù)運(yùn)行。11.4后臺(tái)線程后臺(tái)線程是指為其他線程提供服務(wù)的線程,也稱為守護(hù)線程。Java虛擬機(jī)的垃圾回收線程是典型的后臺(tái)線程,它負(fù)責(zé)回收其他線程不再使用的內(nèi)存。主線程在默認(rèn)的情況下是前臺(tái)線程,由前臺(tái)線程創(chuàng)建的線程在默認(rèn)的情況下也是前臺(tái)線程??赏ㄟ^調(diào)用Thread類的setDaemon(true)方法,把一個(gè)線程設(shè)置為后臺(tái)線程。Thread類的isDaemon()方法用來判斷一個(gè)線程是否是后臺(tái)線程?!纠?1.7】將daemon線程設(shè)為后臺(tái)線程,主線程main()方法中的代碼執(zhí)行完畢時(shí),由于只剩下后臺(tái)線程,無論daemon是否運(yùn)行結(jié)束,main()主線程都結(jié)束,這意味著整個(gè)程序運(yùn)行結(jié)束。11.5線程互斥11.5.1臨界區(qū)所謂臨界區(qū),就是讀/寫同一個(gè)共享變量的程序段。若所有的線程都是獨(dú)立地與其他線程沒有任何聯(lián)系地運(yùn)行,則問題就會(huì)簡單得多,以至不用加以特別考慮,但實(shí)際情況要復(fù)雜得多。最常見的典型情況之一是,兩個(gè)或多個(gè)線程共享同一個(gè)數(shù)據(jù)區(qū),有些線程對(duì)該數(shù)據(jù)區(qū)寫,有些線程對(duì)該數(shù)據(jù)區(qū)讀,還有些線程對(duì)該數(shù)據(jù)區(qū)既讀又寫,這個(gè)共享的數(shù)據(jù)區(qū)就是一個(gè)共享變量。對(duì)共享變量進(jìn)行讀寫的程序段,就是臨界區(qū)?!纠?1.8】測(cè)試對(duì)臨界區(qū)不加特別考慮會(huì)產(chǎn)生什么樣的后果。※
11.5.2對(duì)象鎖機(jī)制Java在語言層次上引入了關(guān)鍵詞synchronized和顯式的Lock對(duì)象來表示這是一個(gè)臨界區(qū)(程序段)。synchronized有兩種格式:格式1: synchronized(任何對(duì)象){ //訪問共享變量的臨界區(qū)(程序段),又稱同步代碼塊 }格式2:同步化方法。在方法的前面加上synchronized,如: publicsynchronizedvoidadd(){ //臨界區(qū) }共享變量所關(guān)聯(lián)的對(duì)象鎖是如何選擇的?即 synchronized(任何對(duì)象){ //臨界區(qū) }※
11.5.2對(duì)象鎖機(jī)制中“任何對(duì)象”是什么含義?程序員在設(shè)計(jì)代碼時(shí),對(duì)每一個(gè)共享變量人為地關(guān)聯(lián)一個(gè)對(duì)象(如Objectlock=newObject();),只要同一個(gè)共享變量的所有臨界區(qū)都是對(duì)同一個(gè)對(duì)象(如上述中的lock)加鎖,就達(dá)到互斥的目的。由于共享變量通常以對(duì)象形式存在,因此常見的做法是直接使用該對(duì)象來進(jìn)行加鎖操作?!纠?1.9】用關(guān)鍵字synchronized解決packageorg.concurrency.critical.test程序的問題。11.5.2對(duì)象鎖機(jī)制對(duì)synchronized的進(jìn)一步討論:(1) synchronized鎖定的是一個(gè)具體對(duì)象,通常是共享變量的對(duì)象。用synchronized括起來的程序段是訪問該共享變量的臨界區(qū),即synchronized代碼塊。由于所有鎖定同一個(gè)對(duì)象的線程之間,在synchronized代碼塊上是互斥的,也就是說,這些線程的synchronized代碼塊之間是串行執(zhí)行的,不再是互相交替穿插并發(fā)執(zhí)行,因而保證了synchronized代碼塊操作的原子性。但synchronized代碼塊與所有線程的非synchronized代碼塊之間以及非synchronized代碼塊與非synchronized代碼塊之間都是互相交替穿插并發(fā)執(zhí)行的,故synchronized代碼塊操作的原子性是邏輯上的,而不是物理上的不可打斷。(2) 每一個(gè)Java對(duì)象都有且只有一個(gè)對(duì)象鎖。任何時(shí)刻,一個(gè)對(duì)象鎖只能被一個(gè)線程所擁有。若兩個(gè)或多個(gè)線程鎖定的不是同一個(gè)對(duì)象,則它們的synchronized代碼塊可以互相交替穿插并發(fā)執(zhí)行。(3) 所有的非synchronized代碼塊或方法,都可自由調(diào)用。如線程A獲得了對(duì)象鎖,調(diào)用需要該對(duì)象鎖的synchronized代碼塊,其他線程仍然可以自由調(diào)用所有非synchronized方法和代碼。11.5.2對(duì)象鎖機(jī)制(4) 若線程A獲得了對(duì)象O的對(duì)象鎖,調(diào)用對(duì)象O的synchronized代碼塊或方法,則線程A仍然可以調(diào)用其他任何需要對(duì)象O的鎖的synchronized代碼塊或方法,這是因?yàn)榫€程A已經(jīng)獲得了對(duì)象O的對(duì)象鎖了。線程A同時(shí)可以調(diào)用需要另一個(gè)對(duì)象K的鎖的synchronized代碼塊或方法,這意味著線程A同時(shí)擁有對(duì)象O和對(duì)象K的對(duì)象鎖。(5) 只有當(dāng)一個(gè)線程執(zhí)行完它所調(diào)用的synchronized代碼塊或方法時(shí),無論是正常執(zhí)行完,還是異常拋出,該線程才會(huì)釋放所獲取的對(duì)象鎖。(6) synchronized并不必然地保護(hù)數(shù)據(jù)。程序員應(yīng)該仔細(xì)分析,識(shí)別出程序中所有的臨界區(qū),并對(duì)這些臨界區(qū)施加synchronized機(jī)制。若有一處或多處遺漏,則共享變量中數(shù)據(jù)就會(huì)產(chǎn)生錯(cuò)誤。(7) 臨界區(qū)中的共享變量應(yīng)定義為private型。否則,其他類的方法可能直接訪問和操作該共享變量,這樣synchronized的保護(hù)就失去了意義。所以只能通過臨界區(qū)訪問共享變量。故鎖定的對(duì)象通常是this,即通常格式都是:synchronized(this){…}(8) 一定要保證,所有對(duì)共享變量的訪問與操作均在synchronized代碼塊中進(jìn)行。11.5.2對(duì)象鎖機(jī)制(9) 通常共享變量都是實(shí)例變量。若臨界區(qū)中的共享變量是一個(gè)類變量,則問題復(fù)雜化了,因?yàn)轭惙椒ㄅc實(shí)例方法均可訪問類變量。而synchronized鎖定的必須是對(duì)象,不能是類。建議是若臨界區(qū)中的共享變量是一個(gè)類變量,則應(yīng)該用類方法來訪問操作該類變量。這個(gè)類方法成為一個(gè)臨界區(qū),必須將該類方法定義為synchronized方法。所有要訪問該共享類變量的實(shí)例方法,都應(yīng)該調(diào)用定義為synchronized的類方法進(jìn)行。若實(shí)例方法一定要想在自己的代碼內(nèi)部,不通過synchronized的類方法訪問共享類變量,則可通過synchronized(類名.class){…來訪問類鎖。Java中,每一個(gè)類都有一個(gè)類對(duì)象,這個(gè)類對(duì)象實(shí)際上是java.lang.Class的一個(gè)實(shí)例對(duì)象,所謂類鎖就是這個(gè)類對(duì)象的一把鎖。注意類鎖與這個(gè)類的實(shí)例對(duì)象的對(duì)象鎖雖然都是對(duì)象鎖,卻是不同的兩把鎖。所有像synchronized(類名.class()){=同步代碼塊}這樣鎖定類對(duì)象(注意:不是鎖定類的某一個(gè)實(shí)例對(duì)象),其中的synchronized代碼塊,都是串行執(zhí)行的,訪問或使用類鎖要仔細(xì)考慮和權(quán)衡。(10)當(dāng)一個(gè)線程進(jìn)入死亡狀態(tài),線程擁有的所有的對(duì)象鎖都被釋放。11.5.3顯式的Lock對(duì)象JavaSE5引入了java.util.concurrent.lock類庫,這是解決互斥問題的第二種機(jī)制。用ReentrantLock類創(chuàng)建一個(gè)Lock對(duì)象,來保護(hù)臨界區(qū)。用ReentrantLock保護(hù)代碼塊的基本結(jié)構(gòu)如下。 privateLocklocker=newReentrantLock();locker.lock(); //加鎖try{ …}finally{ locker.unlock(); //解鎖 }lock()與unlock()必須配套使用。必須確保lock()對(duì)應(yīng)的unlock()一定會(huì)得到執(zhí)行。因此,必須把unlock()放到finally塊中,確保無論是正常執(zhí)行,還是異常拋出,unlock()一定會(huì)得到執(zhí)行。【例11.10】使用Lock對(duì)象實(shí)現(xiàn)線程互斥。11.6線程同步j(luò)oin()方法是Thread類的一個(gè)方法,而wait()、notify()、notifyAll()是java.lang.Object類的方法,這意味著,任何一個(gè)Java對(duì)象(包括線程對(duì)象)都有wait()、notify()、notifyAll()方法,但只有線程對(duì)象才有join()方法。wait()方法有兩種格式:格式1:publicfinalvoidwait()throwsInterruptedException只有擁有該對(duì)象的“對(duì)象鎖”的線程才能調(diào)用該對(duì)象的wait()方法。該方法的功能是,使調(diào)用者(線程)釋放該“對(duì)象鎖”,并進(jìn)入“阻塞”狀態(tài),Java系統(tǒng)將這個(gè)調(diào)用者(線程)放入該對(duì)象的wait等待隊(duì)列中。當(dāng)另外一個(gè)線程調(diào)用該對(duì)象的notify()、notifyAll()方法時(shí),喚醒處于這個(gè)對(duì)象的wait等待隊(duì)列中的線程,進(jìn)入運(yùn)行態(tài)。線程喚醒后能否沿原來斷點(diǎn)處繼續(xù)執(zhí)行,取決于該線程能否重新得到該對(duì)象的“對(duì)象鎖”。若得不到對(duì)象鎖,則根據(jù)synchronized的獲取對(duì)象鎖的機(jī)制,該線程將進(jìn)入“阻塞”狀態(tài),并被放入該對(duì)象的對(duì)象鎖等待隊(duì)列中。當(dāng)其他線程歸還對(duì)象鎖時(shí)會(huì)自動(dòng)喚醒它。如前所述,另一個(gè)線程若調(diào)用該線程的interrupt()方法,將喚醒該線程,中斷它的“阻塞”狀態(tài),進(jìn)入“運(yùn)行”態(tài)。但只有該線程重新獲取到該對(duì)象的“對(duì)象鎖”時(shí),才會(huì)拋出InterruptedException異常給該線程。wait()方法使該線程只釋放這個(gè)對(duì)象的對(duì)象鎖并進(jìn)入這個(gè)對(duì)象的wait等待隊(duì)列中,若該線程同時(shí)還擁有其他對(duì)象的對(duì)象鎖,這些對(duì)象鎖不會(huì)被釋放。釋放對(duì)象鎖的主要原因是盡可能降低產(chǎn)生線程間死鎖的機(jī)率?!?/p>
11.6線程同步格式2:publicfinalvoidwait(long
timeout)throwsInterruptedException其中:timeout是毫秒。含義同上。只增加了當(dāng)指定的時(shí)間一到,線程被喚醒,進(jìn)入運(yùn)行態(tài)。然后線程試圖重新獲取對(duì)象鎖。只有獲取到對(duì)象鎖,才能繼續(xù)原先的斷點(diǎn)往下執(zhí)行。若timeout=0,則等同于wait()。notify()和notifyAll()方法notify的格式為:publicfinalvoidnotify()只有擁有該對(duì)象的“對(duì)象鎖”的線程才能調(diào)用該對(duì)象的notify()方法。該方法的功能是,從該對(duì)象的wait等待隊(duì)列中選擇一個(gè)線程喚醒它,選擇的算法由具體實(shí)現(xiàn)者決定,可簡單認(rèn)為是從隊(duì)列中任意選擇一個(gè)線程。大部分情況下,wait()與notify()或notifyAll()是配套成對(duì)使用的。若對(duì)一個(gè)wait(),程序員忘記用相應(yīng)的notify()或notifyAll()來喚醒,則極大地增加產(chǎn)生死鎖的概率??紤]到盡可能降低死鎖產(chǎn)生的潛在可能性,通常建議使用notifyAll(),其格式為:publicfinalvoidnotifyAll()【例11.11】線程間的同步。11.6線程同步對(duì)wait()/notify()/notifyAll()的小結(jié):(1) 必須保證,每一個(gè)wait()都有相應(yīng)的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全管理制度與操作手冊(cè)
- 2025年企業(yè)合規(guī)管理與企業(yè)文化建設(shè)手冊(cè)
- 醫(yī)療機(jī)構(gòu)病歷管理與信息化建設(shè)指南
- 工程支付擔(dān)保制度
- 學(xué)校安全管理與應(yīng)急預(yù)案指南
- 建筑工程安全施工管理手冊(cè)
- 超市員工培訓(xùn)及提升制度
- 超市商品銷售及市場調(diào)研制度
- 《JavaScript前端開發(fā)技術(shù)》試卷(5)參考答案
- 2026年棗陽市勝航實(shí)業(yè)有限公司招聘備考題庫及答案詳解1套
- 2026年無錫商業(yè)職業(yè)技術(shù)學(xué)院單招職業(yè)技能筆試備考試題帶答案解析
- 2026年初二物理寒假作業(yè)(1.31-3.1)
- 2025秋人教版七年級(jí)上冊(cè)音樂期末測(cè)試卷(三套含答案)
- 2025-2030中國工業(yè)硅行業(yè)市場現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 吸痰操作課件
- 農(nóng)產(chǎn)品加工副產(chǎn)物的資源化利用研究-洞察及研究
- 設(shè)計(jì)素描教案
- 初一上冊(cè)語法課件大綱
- 2025年汽車零部件行業(yè)市場調(diào)研:細(xì)分品類、技術(shù)創(chuàng)新及配套需求報(bào)告
- 用pdca降低會(huì)陰切開率課件
- 催收高手實(shí)戰(zhàn)話術(shù)
評(píng)論
0/150
提交評(píng)論