




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第十三章多線程遼寧機(jī)電職業(yè)技術(shù)學(xué)院信息工程系軟件教研室遲勇回顧補(bǔ)充代碼完成:使用字符流從指定文件中讀取數(shù)據(jù) FileReaderfr=newFileReader("C:\\myproject\\document\\readme1.txt"); charc[]=newchar[260];//定義了字符型數(shù)組作為緩沖區(qū)while(fr.
(c)!=-1){//從流fr中讀入字符到數(shù)組c中 Stringstr=newString(
); System.out.println(“正在寫出到控制臺:”+str);
}
fr.close();
cread本章學(xué)習(xí)任務(wù)使用線程改造時(shí)鐘程序利用多線程同步技術(shù)提取賬戶資金設(shè)置線程優(yōu)先級,模擬乘客登車本章技能目標(biāo)了解Java多線程機(jī)制的意義學(xué)會創(chuàng)建線程的兩種基本方法了解線程的生命周期掌握線程的同步和調(diào)度技巧預(yù)習(xí)檢查(1)--預(yù)習(xí)新單詞單詞釋義單詞釋義ProcessThreadMulti-ThreadPoolRunnablesleepjoinSynchronizednotify預(yù)習(xí)檢查(2)實(shí)現(xiàn)多線程的兩種方式:繼承java.lang.Thread超類、實(shí)現(xiàn)java.lang.Runnable接口;多線程-內(nèi)容目錄線程概述多線程的實(shí)現(xiàn)線程的同步與調(diào)度13.1線程的概述每個(gè)應(yīng)用程序都是系統(tǒng)的一個(gè)進(jìn)程(Process),它們擁有自己獨(dú)立內(nèi)存空間和系統(tǒng)資源,互不干擾。它們的數(shù)據(jù)互不關(guān)聯(lián)、彼此獨(dú)立,只是通過分配的進(jìn)程ID號(PID)來識別。線程(Thread)與進(jìn)程類似,是程序中一個(gè)具有獨(dú)立順序的程序流,它有自己的開始、代碼體和結(jié)束。一個(gè)進(jìn)程可以包含若干個(gè)線程。但與進(jìn)程不同的是,線程之間可以共享內(nèi)存空間和資源,線程間切換的系統(tǒng)開銷遠(yuǎn)小于進(jìn)程,所以有時(shí)我們也把線程稱為輕進(jìn)程(Light-weightProcess)。13.1線程的概述表13-1系統(tǒng)隊(duì)列中的進(jìn)程與線程……
進(jìn)程2線程1線程2數(shù)據(jù)資源
進(jìn)程1線程1線程2數(shù)據(jù)資源單線程,就是說一個(gè)應(yīng)用進(jìn)程中只包含一個(gè)線程(即主線程),此線程運(yùn)行結(jié)束則進(jìn)程也會結(jié)束。多線程(Multi-Thread)就是在操作多任務(wù)的思想基礎(chǔ)上,將一個(gè)進(jìn)程再分解為若干個(gè)線程,從而使單個(gè)進(jìn)程也可以同時(shí)完成多種任務(wù)。單線程與多線程模式對比圖13-2單線程運(yùn)行時(shí)序圖CPU運(yùn)行時(shí)刻T線程2線程1線程阻塞執(zhí)行請求1請求2處理1下載數(shù)據(jù)1處理2下載數(shù)據(jù)2圖13-2單線程運(yùn)行時(shí)序圖CPU運(yùn)行時(shí)刻T線程2線程1線程阻塞執(zhí)行請求1請求2處理1下載數(shù)據(jù)1處理2下載數(shù)據(jù)2多線程的比喻再做一個(gè)比較容易理解的比喻:畢業(yè)酒會上,同學(xué)們圍坐在一個(gè)圓桌子旁,每人面前有一個(gè)大酒杯,并且有一個(gè)服務(wù)生繞著桌子專門為大家斟滿酒,因?yàn)楸雍艽?,同學(xué)們的酒量又不行,服務(wù)生已經(jīng)繞著桌子轉(zhuǎn)了一圈,大家面前的酒還沒喝完,但是熱心的服務(wù)生會再次為大家斟滿酒,這樣周而復(fù)始,在桌子旁的每個(gè)人可能都感覺自己酒杯里的酒始終沒有喝完,而這其實(shí)都是那位熱心的服務(wù)生的功勞。我們假設(shè)每個(gè)人喝酒的動作都是一個(gè)線程,那么服務(wù)生就是高效率的CPU,而他手里的酒就是要下載或處理的資源。多線程-內(nèi)容目錄線程概述多線程的實(shí)現(xiàn)線程的同步與調(diào)度13.2多線程(Multi-Thread)的實(shí)現(xiàn)1多線程的改造示例2構(gòu)造多線程的方式3線程的常用方法4線程的生命周期13.2.1多線程的改造實(shí)例在第11章我們曾經(jīng)接觸過線程的例子,借助線程實(shí)現(xiàn)了一個(gè)動畫的繪制,并且介紹了Thread類的靜態(tài)方法sleep(),它可使當(dāng)前線程休眠,具體請參考前面示例11-11。下面先來看一個(gè)簡單的例子,借此了解使用多線程的必要意義。我們希望在Applet中顯示一個(gè)時(shí)鐘,并且能顯示每一秒鐘的變化,它的代碼如下:例13-1:Applet時(shí)鐘程序DigitalClock.htm程序代碼<HTML><BODYBGCOLOR="000000"><CENTER><APPLET> code ="DigitalClock.class" width ="500" height ="100"</APPLET></CENTER></BODY></HTML>例13-1:Applet時(shí)鐘程序importjava.awt.Graphics;importjava.awt.Font;importjava.util.Date;publicclassDigitalClockextendsjava.applet.Applet{ FonttheFont=newFont("TimesRoman",Font.BOLD,24);//定義字體
DatetheDate=newDate();//初始化Date實(shí)例為當(dāng)前日期
DigitalClock.java
程序代碼publicvoidstart() { while(true) { theDate=newDate(); repaint();//發(fā)出重繪請求
try{ Thread.sleep(1000);//線程休眠1秒種
}catch(InterruptedExceptione){} }} publicvoidpaint(Graphicsg) { g.setFont(theFont);//設(shè)置字體格式
g.drawString(theDate.toString(),10,50);//繪制當(dāng)前日期字符串
}}例13-1:Applet時(shí)鐘程序運(yùn)行出現(xiàn)的問題代碼的運(yùn)行結(jié)果:這個(gè)時(shí)鐘并沒有正常地運(yùn)轉(zhuǎn)起來,這是為什么呢?時(shí)鐘沒有正常運(yùn)轉(zhuǎn)的原因是在于:無限循環(huán)while(true)。這個(gè)程序并沒有應(yīng)用多線程,整個(gè)Applet只有一個(gè)主線程,并且被while(true)獨(dú)占,它占據(jù)了這個(gè)程序的所有CPU時(shí)間和資源。下面我們改造這個(gè)程序,讓它支持多線程,如示例13-2所示。DigitalClock.java程序代碼例13-2:改造后的Applet時(shí)鐘程序importjava.awt.Graphics;importjava.awt.Font;importjava.util.Date;/*程序?qū)崿F(xiàn)了Runnable接口,來引入多線程功能*/publicclassDigitalClockextendsjava.applet.AppletimplementsRunnable{ FonttheFont=newFont("TimesRoman",Font.BOLD,24); DatetheDate=newDate(); Threadrunner;//定義了線程類實(shí)例
例13-2:改造后的Applet時(shí)鐘程序--2
publicvoidstart() { if(runner==null)//判斷線程是否為空
{ runner=newThread(this);//初始化線程類實(shí)例
runner.start();//線程類實(shí)例進(jìn)入就緒狀態(tài)
} } publicvoidstop() { if(runner!=null) { runner.stop();//終止線程
runner=null;//釋放線程所占內(nèi)存空間
} }
publicvoidrun()//實(shí)現(xiàn)Runnable接口的run()方法
{ while(true) { theDate=newDate(); repaint(); try{ Thread.sleep(1000);} catch(InterruptedExceptione){} } } publicvoidpaint(Graphicsg) { g.setFont(theFont); g.drawString(theDate.toString(),10,50); }}運(yùn)行結(jié)果【運(yùn)行結(jié)果】運(yùn)行這個(gè)Applet程序,發(fā)現(xiàn)時(shí)鐘可以正常運(yùn)轉(zhuǎn),如圖所示。13.2.2構(gòu)造多線程的方式Thread類的構(gòu)造方法如下:Thread([ThreadGroupgroup],[Runnabletarget],[Stringname]); group參數(shù)指定該線程所屬的線程組;target作為其運(yùn)行對象,它必須實(shí)現(xiàn)Runnable接口;name為線程名稱。三個(gè)參數(shù)為可選,當(dāng)某個(gè)參數(shù)為null時(shí),構(gòu)造方法可以為:Thread();Thread(Runnabletarget);Thread(Runnabletarget,Stringname);Thread(Stringname);Thread(ThreadGroupgroup,Runnabletarget);Thread(ThreadGroupgroup,Stringname);構(gòu)造多線程的方式Runnable接口中有run()方法,Thread類也有run()方法,它是線程運(yùn)行的主體,線程運(yùn)行所需的代碼寫在此方法體內(nèi),所以應(yīng)該或必須重寫run()方法來完成所需功能。下面介紹創(chuàng)建線程的兩種方法:繼承Thread超類和實(shí)現(xiàn)Runnable接口。方式1:繼承Thread類定義的線程類可以通過繼承java.lang.Thread超類來實(shí)現(xiàn),語法如下:
publicclass<類名>extendsThread{……}例13-3:多線程顯示輸出TwoThread.java程序代碼publicclassTwoThread{ staticThread01th01;//定義線程類Thread01實(shí)例th01 staticThread02th02;//定義線程類Thread02實(shí)例th02 publicstaticvoidmain(Stringargs[]){ th01=newThread01("thisisthread01!");//創(chuàng)建實(shí)例th01 th02=newThread02("Iamthread02!");//創(chuàng)建實(shí)例th02 th01.start();//實(shí)例th01進(jìn)入就緒狀態(tài)
th02.start();//實(shí)例th02進(jìn)入就緒狀態(tài)
}}方式1:繼承Thread類--2classThread01extendsThread{ publicThread01(Stringname){ super(name);}//為線程命名 publicvoidrun()//重寫線程體
{ for(inti=0;i<5;i++) { System.out.println(this.getName());//輸出線程名
try{Thread.sleep(500);}
catch(InterruptedExceptione){} } }}classThread02extendsThread{ publicThread02(Stringname){ super(name);}//為線程命名
publicvoidrun()//重寫線程體
{ for(inti=0;i<5;i++)
{ System.out.println(this.getName());//輸出線程名
try{Thread.sleep(300);}//線程睡眠,讓出CPU catch(InterruptedExceptione){} } } }【運(yùn)行結(jié)果】【運(yùn)行結(jié)果】運(yùn)行結(jié)果如圖所示,兩個(gè)線程實(shí)例名交互輸出。方式2:實(shí)現(xiàn)Runnable接口定義的線程類在構(gòu)造可以通過一個(gè)實(shí)現(xiàn)了java.lang.Runnable接口的目標(biāo)對象來實(shí)現(xiàn),語法如下:
publicclass<類名>extends<父類名>implementsRunnable
{publicvoidrun(){……}//重寫Runnable接口中的run()方法
}
使用Runnable接口來構(gòu)造線程的優(yōu)點(diǎn)顯而易見:Java不支持多繼承,為了繼承父類,只能采取實(shí)現(xiàn)接口的方式來構(gòu)造線程。
例如前面的Applet示例13-2。需要注意的是使用這種方式構(gòu)建線程時(shí),必須指明線程的目標(biāo)對象target,即指明線程的主體run()方法的定義位置,其程序結(jié)構(gòu)大體如下:
實(shí)現(xiàn)Runnable接口的程序結(jié)構(gòu)publicclassDigitalClockextendsAppletimplementsRunnable{ Threadrunner;//定義線程類實(shí)例
publicvoidstart() { if(runner==null) { runner=newThread(this);//初始化線程類實(shí)例,并指明target對象this runner.start();//線程就緒,獲得CPU運(yùn)行調(diào)度后,將開始運(yùn)行run()方法
} } publicvoidrun(){……}//run()方法定義在實(shí)現(xiàn)Runnable接口的類中}13.2.3線程的常用成員方法下面是線程操作中常用的一些方法,包括前面使用過的start()、sleep()、run()等方法;下一小節(jié)將要介紹的線程同步和調(diào)度join()、yield()等方法;還有用于設(shè)置或獲取線程屬性的getName()、getPriority()等方法。線程生命周期相關(guān)方法voidstart()使該線程就緒。當(dāng)CPU開始執(zhí)行該線程時(shí)將調(diào)用run方法。voidrun()該線程運(yùn)行的主體。voidstop()已過時(shí)。用于退出線程,該方法具有不安全性。退出目標(biāo)線程應(yīng)采取判斷線程對象是否改變并修改線程變量為null的方式進(jìn)行。13.2.3線程的常用成員方法線程屬性相關(guān)方法booleanisAlive()測試線程是否處于活動狀態(tài)。booleanisDaemon()測試該線程是否為后臺線程。staticThread
currentThread()返回對當(dāng)前正在執(zhí)行的線程對象的引用。String
getName()返回該線程的名稱。intgetPriority()返回線程的優(yōu)先級。Thread.State
getState()返回該線程的狀態(tài)。ThreadGroup
getThreadGroup()返回該線程所屬的線程組。staticbooleaninterrupted()測試當(dāng)前線程是否已經(jīng)中斷。voidsetDaemon(booleanon)將該線程標(biāo)記為后臺線程。voidsetName(Stringname)改變線程名為參數(shù)name。voidsetPriority(intnewPriority)更改線程的優(yōu)先級。String
toString()返回該線程的字符串表示形式。13.2.3線程的常用成員方法調(diào)度與線程同步方法voiddestroy()已過時(shí)。該方法用于銷毀線程,可能會出現(xiàn)死鎖。voidresume()已過時(shí)。該方法只與suspend()一起使用,用于恢復(fù)掛起的線程,有可能造成死鎖。staticvoidsleep(longmillis)在指定的longmillis毫秒數(shù)內(nèi)讓當(dāng)前正在執(zhí)行的線程休眠(暫停執(zhí)行)。voidinterrupt()中斷線程。voidjoin()等待該線程終止。voidjoin(longmillis)等待該線程終止的時(shí)間最長為longmillis毫秒。voidsuspend()已過時(shí)。將目標(biāo)線程掛起,可能會出現(xiàn)死鎖。staticvoidyield()暫停當(dāng)前正在執(zhí)行的線程對象,并執(zhí)行其他線程。13.2.4線程的生命周期在Java程序中,線程就是一段Java代碼,就是類的對象。同其它對象(比如Applet)一樣,它也有從新生到消亡的生命周期,線程的生命周期有5種狀態(tài):新生、就緒、運(yùn)行、阻塞、死亡,如圖13-4所示。新生就緒運(yùn)行死亡newstart()run()stop()阻塞sleep()、wait()yield()表13-4線程的生命周期多線程-內(nèi)容目錄線程概述多線程的實(shí)現(xiàn)線程的同步與調(diào)度13.3線程的同步和調(diào)度1一個(gè)失敗的多線程示例2線程同步(synchronized)3有關(guān)線程的調(diào)度方法13.3.1 一個(gè)失敗的多線程示例在多線程的程序中,由于多個(gè)線程可以同時(shí)訪問同一個(gè)變量或方法,如果一個(gè)線程對它們的訪問尚未結(jié)束,另一個(gè)線程就開始處理,就會產(chǎn)生錯(cuò)誤的結(jié)果。例如,現(xiàn)銀行有一賬戶,假設(shè)有多個(gè)客戶在不同的取款臺同時(shí)對這一賬戶取款,前面的客戶提款操作尚未完成,而后面的客戶就開始提款操作,可能此時(shí)后面的客戶是在前面客戶尚未更新的賬戶余額上操作,那就會造成透支。請先看下面的失敗案例。例13-4:利用多線程模擬多個(gè)客戶同時(shí)提取同一賬戶資金的情況銀行賬號類:BankAccount提款客戶類:Customer銀行系統(tǒng)主類:BankSystem運(yùn)行結(jié)果會發(fā)現(xiàn)結(jié)果運(yùn)行不正確!顯示結(jié)果第五行:“*****客戶乙提款后:余額為4500元*****”,實(shí)際應(yīng)為4000元!而最后余額實(shí)際應(yīng)為3000元。【運(yùn)行結(jié)果】按照順序編譯,運(yùn)行這三個(gè)類文件,結(jié)果如圖所示:【程序分析】解決這種問題的方法解決這種問題的方法應(yīng)當(dāng)采用多線程的“同步機(jī)制”。所謂“同步”(synchronized),是指將被當(dāng)前線程訪問的對象或方法加鎖(即獨(dú)占資源,其他想訪問此資源的線程只有等待),只有取得開鎖鑰匙的線程才能訪問該對象或方法。在例13-4中,takeMoney()方法將被客戶甲和客戶乙兩個(gè)線程訪問,如果能限制在客戶甲訪問該方法時(shí),客戶乙不能訪問該方法,直到客戶甲退出takeMoney()方法,客戶乙才能訪問takeMoney()方法,這樣,就可以保證賬戶余額的正確更新。13.3.2 線程同步(synchronized)實(shí)現(xiàn)同步訪問某一對象或方法,必須在被訪問的對象或方法前加synchronized關(guān)鍵字。如果對象或方法被設(shè)為“同步”,在同一時(shí)刻將只能有一個(gè)線程操作此對象或方法(相當(dāng)于在要操作的對象和方法上加了鎖)。
如果將示例13-4的takeMoney()加上同步控制符synchronized(見代碼第4行,其它代碼不變),將會得到正確的結(jié)果。見示例13-5。
例13-5:利用多線程同步技術(shù)提取賬戶資金的情況publicsynchronizedstaticvoidtakeMoney(Stringclient,intiAmount)//同步支取資金方法,此處添加了synchronized關(guān)鍵字13.3.3線程的調(diào)度有時(shí)一些線程需要共享一些數(shù)據(jù)資源,例如典型的“生產(chǎn)者-消費(fèi)者”的例子,生產(chǎn)者向倉庫輸入一份商品,消費(fèi)者從倉庫取出一份商品,生產(chǎn)者必須預(yù)先將一份商品放入倉庫,否則消費(fèi)者無法從空倉庫取出商品。再比如兩個(gè)線程同時(shí)操作一個(gè)網(wǎng)絡(luò)文件,一個(gè)將數(shù)據(jù)寫入文件,一個(gè)從文件中讀取數(shù)據(jù),要求在數(shù)據(jù)完全寫入文件后才能讀取,這些情況下,要考慮這些線程的運(yùn)行狀態(tài),即在一定條件下線程才可以切換,這需要“調(diào)度”來達(dá)到預(yù)期效果。調(diào)度的方法調(diào)度的方法通常有兩種:1)設(shè)置線程優(yōu)先級完成自動調(diào)度;2)使用等待(wait)、喚醒(notify)等方法完成手工調(diào)度。1.線程優(yōu)先級(Priority)在多線程機(jī)制下,在線程等待池中的哪個(gè)線程能夠被優(yōu)先執(zhí)行,取決于線程的“優(yōu)先級”,優(yōu)先級高的線程優(yōu)先獲得CPU運(yùn)行權(quán)。Java中線程的優(yōu)先級分為1~10級,1級(即MIN_PRIORITY)最低,10級(即MAX_PRIORITY)最高。如果不做優(yōu)先級設(shè)置,通常線程的默認(rèn)優(yōu)先級為5級(即NORM_PRIORITY),如果要改變線程優(yōu)先級,可以使用setPriority()方法設(shè)置。例13-6:設(shè)置線程優(yōu)先級,模擬乘客登車?yán)?3-6:設(shè)置線程優(yōu)先級,模擬乘客登車(假設(shè)乘客中有兒童、婦女和老人,其中,兒童優(yōu)先上車,老年人次之,最后是婦女,每個(gè)站點(diǎn)上車的人數(shù)是隨機(jī)的)/*子線程類*/classPassengerextendsThread{publicPassenger(StringpassengerName){super(passengerName);//設(shè)置線程名稱}publicvoidrun(){intsum=(int)(Math.random()*5);//隨機(jī)生成站點(diǎn)人數(shù)System.out.println("===共有"+sum+"個(gè)"+this.getName()+"正在等待上車.===");for(inti=0;i<sum;i++){System.out.println("現(xiàn)在第"+(i+1)+"個(gè)"+this.getName()+"正在上車.");//顯示上車乘客的身份}}publicclassGetOnBus{publicstaticvoidmain(String[]args){Passengerchildren=newPassenger("學(xué)齡前兒童");Passengerwomen=newPassenger("婦女");Passengerelder=newPassenger("老年人");children.setPriority(10); //設(shè)置children為最高優(yōu)先級elder.setPriority(Thread.NORM_PRIORITY);//設(shè)置elder為普通優(yōu)先級women.setPriority(1); //設(shè)置women為最低優(yōu)先級women.start(); //線程就緒elder.start(); children.start(); }}運(yùn)行結(jié)果但是這種調(diào)度,不一定按照我們設(shè)想的順序完成,因?yàn)榫€程執(zhí)行的先后順序是由操作系統(tǒng)對CPU的調(diào)度機(jī)制來控制的,即使給線程設(shè)置高優(yōu)先級,也不能確定它一定會得到CPU的執(zhí)行時(shí)間!2.手工調(diào)度由于自動調(diào)度的局限,使得略為復(fù)雜的線程控制就無法實(shí)現(xiàn),如果我們希望線程能按照我們的預(yù)期那樣地運(yùn)行,就必須使用wait()與notify()等方法來手工調(diào)度。wait()與notify()、notifyAll()等方法被定義在Object類中:wait()方法可使當(dāng)前線程處于等待(阻塞)狀態(tài),從而釋放自己的線程鎖給其它線程使用,直到其它線程使用notify()或notifyAll()方法喚醒它為止。notifyAll()方法可喚醒所有調(diào)用了wait()方法而處于等待的線程,而notify()方法可喚醒單個(gè)線程,但這種喚醒是隨意性的。(補(bǔ)充實(shí)例13-7:)例13-7使用手工調(diào)度改造前面用戶提款繼續(xù)改造前面用戶提款的實(shí)例(例13-4、例13-5),使用戶提款的順序可以按照我們設(shè)定的過程來執(zhí)行。改造過程如下:(1)為Customer類添加一個(gè)公用的BankAccount類對象,并改造其構(gòu)造方法;(2)為BankAccount類的takeMoney()方法添加wait()和notify()方法,實(shí)現(xiàn)手工調(diào)度。例13-7使用手工調(diào)度改造前面用戶提款銀行賬號類:BankAccountclassBankAccount{ privatestaticinttotalBalance=1000;//假設(shè)賬戶余額為1000元 publicsynchronizedvoidtakeMoney(Stringclient,intiAmount)//支取資金方法 { intgetBalance=totalBalance;//取得賬戶余額 getBalance-=iAmount;//根據(jù)支取現(xiàn)金的數(shù)量,修正賬戶余額 /*利用sleep(1000)休眠1秒鐘,模擬提款時(shí)數(shù)據(jù)庫更新需要的時(shí)間*/ try{ Thread.sleep(1000); }catch(InterruptedExceptione){ } totalBalance=getBalance;//提款后,更新賬戶余額 System.out.println("*****"+client+"提款后:"+"余額為"+totalBalance+"元"+"*****");
notify();//通知處于等待狀態(tài)的線程,可以啟動
try{
wait();//使當(dāng)前線程處于等待狀態(tài)
}catch(Exceptione){ } } publicstaticintgetBalance()//讀取總余額 { returntotalBalance; }}例13-7使用手工調(diào)度改造前面用戶提款提款客戶類:CustomerclassCustomerextendsThread//客戶線程{
BankAccountaccount;//用戶要操作的公用對象 privateintgetMoney;//客戶提款額 publicCustomer(StringcustomerName,intmoney,BankAccountaccount)//構(gòu)造方法 { super(customerName); getMoney=money;
this.account=account; } publicvoidrun()//客戶線程主體 { for(in
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公務(wù)往返簽證管理辦法
- 北京收容管理辦法修訂
- 創(chuàng)新重點(diǎn)稅源管理辦法
- 公益訴訟損害管理辦法
- 回收芯片高頻管理辦法
- 團(tuán)隊(duì)目標(biāo)考核管理辦法
- 醫(yī)療廢物出境管理辦法
- 作業(yè)工具管理辦法臺賬
- 林業(yè)園林建設(shè)管理辦法
- 接收機(jī)系統(tǒng)設(shè)計(jì)與仿真
- 下肢靜脈曲張
- 2024年露營帳篷項(xiàng)目可行性研究報(bào)告
- 《公務(wù)員錄用體檢操作手冊(試行)》
- 2024粵東西粵北地區(qū)教師全員輪訓(xùn)培訓(xùn)心得總結(jié)
- 2024-2025學(xué)年華東師大版數(shù)學(xué)七年級上冊計(jì)算題專項(xiàng)訓(xùn)練
- 福建省機(jī)關(guān)工作人員年度考核登記表
- JBT 7808-2010 無損檢測儀器 工業(yè)X射線探傷機(jī)主參數(shù)系列
- DB44-T 2474-2024 自然教育標(biāo)識設(shè)置指引
- 研學(xué)基地合作協(xié)議
- 駕駛員行為規(guī)范管理制度
- 《鍋爐水介質(zhì)檢驗(yàn)導(dǎo)則標(biāo)準(zhǔn)-征求意見稿》
評論
0/150
提交評論