第10章線程ppt課件_第1頁
第10章線程ppt課件_第2頁
第10章線程ppt課件_第3頁
第10章線程ppt課件_第4頁
第10章線程ppt課件_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、電腦基礎實例上機系列叢書java程序設計教程清華大學出版社第10章 多線程學習目標 本章要點上機練習 習 題電腦基礎實例上機系列叢書java程序設計教程清華大學出版社學習目標 在計算機處理任務時,往往需要操作系統(tǒng)同時處理多個任務,這些任務就由操作系統(tǒng)本身和cpu來控制。有時也需要自己創(chuàng)建多個任務來讓系統(tǒng)同時完成,這些用戶自己定制的任務都是非常小的程序段,稱為線程。本章介紹線程的基本概念和多線程技術,詳細講解線程的創(chuàng)建,如何實現(xiàn)多線程,還介紹線程同步、線程死鎖和線程調(diào)度等控制技術。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社本章要點 線程的生命周期多線程技術線程的創(chuàng)建和實現(xiàn)多線程線

2、程的同步和死鎖電腦基礎實例上機系列叢書java程序設計教程清華大學出版社多線程技術的基本概念 多線程是java程序的一個重要特征,線程本來是操作系統(tǒng)中的概念,java將這一概念引入到程序設計語言中,讓開發(fā)人員利用線程機制編寫多線程程序,使系統(tǒng)能夠同時運行多個執(zhí)行體,從而加快程序的響應速度,提高電腦資源的利用率。本節(jié)主要介紹多線程機制的一些基本概念。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社多線程技術的基本概念什么是線程線程的生命周期 多線程技術 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社什么是線程線程和進程類似,是一段完成特定功能的代碼。線程是程序中單個程序的控

3、制流,也是一個進程內(nèi)的基本調(diào)度單位。線程和進程一樣擁有獨立的執(zhí)行控制,并由操作系統(tǒng)負責調(diào)度。 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社什么是線程同一個進程可以包含多個線程,這些線程共享屬于該進程的一塊內(nèi)存空間和一組系統(tǒng)資源,而線程自身的數(shù)據(jù)通常只有cpu的寄存器數(shù)據(jù),以及一個供程序執(zhí)行時使用的堆棧,系統(tǒng)在產(chǎn)生一個線程,或者在各個線程之間切換時,負荷比進程小得多。 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社什么是線程此外,由于線程知識在單個進程的作用域內(nèi)活動,所以線程之間的通信也比進程簡單。線程的實現(xiàn)要依賴操作系統(tǒng),現(xiàn)在一般操作系統(tǒng)都支持線程技術。電腦基礎實例上

4、機系列叢書java程序設計教程清華大學出版社什么是線程一個或更多的線程構成了一個進程。一個線程或執(zhí)行上下文由一個虛擬處理機、cpu執(zhí)行的代碼和代碼操作的數(shù)據(jù)3個主要部分組成。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程執(zhí)行的主要組成部分電腦基礎實例上機系列叢書java程序設計教程清華大學出版社什么是線程代碼可以由多個線程共享,也可以不被共享,這些都和數(shù)據(jù)是獨立的。兩個線程如果執(zhí)行同一個類的實例代碼,則它們可以共享相同的代碼。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社什么是線程類似地,數(shù)據(jù)可以由多個線程共享,也可以不被共享,這些都和代碼是獨立的。兩個線程如果共享

5、對一個公共對象的存取,則它們可以共享相同的數(shù)據(jù)。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社什么是線程在java編程中,虛擬處理機封裝在thread類的一個實例。構造線程時,代碼和數(shù)據(jù)是由傳遞給它的構造方法的對象指定的。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程的生命周期 每個java程序都有一個默認的主線程,對于java applicatin應用程序,主線程就是main方法執(zhí)行的指令序列,對于java applet,主線程指揮瀏覽器裝載并執(zhí)行java applet。線程在它完整的生命周期中包括新建、就緒、運行、阻塞和死亡5種狀態(tài)。電腦基礎實例上機系列叢書ja

6、va程序設計教程清華大學出版社線程的生命周期新建(new):代表線程的對象已經(jīng)被初始化,但尚未運行run方法。就緒(runnable):線程正在運行run方法,但這只說明線程目前處于的狀態(tài)。如果系統(tǒng)沒有能力抽出cpu執(zhí)行時間給線程,線程就“不執(zhí)行”,這里的“不執(zhí)行”不代表“阻塞”或“死亡”。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程的生命周期運行(running):線程獲得了cpu資源正在執(zhí)行任務,將一直運行到結(jié)束,除非此時它自動放棄資源或有更加高優(yōu)先級的線程進入。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程的生命周期阻塞(blcked):線程是可以執(zhí)行的

7、,但由于某些因素的阻礙處于停滯狀態(tài),系統(tǒng)排程器略過了應給線程的cpu執(zhí)行時間。死亡(dead):線程的正式結(jié)束方式,run方法執(zhí)行完畢并返回。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社多線程技術 多線程是這樣一種機制,它允許在程序中并發(fā)執(zhí)行多個指令流,每個指令流都稱為一個線程,線程彼此間互相獨立。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社多線程技術 線程和進程一樣擁有獨立的執(zhí)行控制,由操作系統(tǒng)負責調(diào)度,區(qū)別在于線程沒有獨立的存儲空間,而是和所屬進程中的其它線程共享一個存儲空間,這使得線程間的通信比進程簡單。電腦基礎實例上機系列叢書java程序設計教程清華大學出版

8、社多線程技術 多個線程的執(zhí)行是并發(fā)的,也就是在邏輯上“同時”,而不管是否是物理上的“同時”。如果系統(tǒng)只有一個cpu,那么真正的“同時”是不可能的,但是由于cpu的速度非???,用戶感覺不到其中的區(qū)別,因此也不用關心它,只需要設想各個線程是同時執(zhí)行即可。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社多線程技術 多線程和傳統(tǒng)的單線程在程序設計上最大的區(qū)別在于,由于各個線程的控制流彼此獨立,使得各個線程之間的代碼是無序執(zhí)行的。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社多線程技術的實現(xiàn) 在了解了線程的基本概念之后,本節(jié)將繼續(xù)深入,介紹如何創(chuàng)建線程,如何實現(xiàn)多線程,線程同步、死

9、鎖和調(diào)度等等多線程技術。線程的創(chuàng)建 如何實現(xiàn)多線程 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社多線程技術的實現(xiàn) 線程同步 線程死鎖 線程調(diào)度 應用舉例搶硬幣 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程的創(chuàng)建 為了創(chuàng)建一個新的線程,必須指明這個線程所要執(zhí)行的代碼,java是通過類做到這一點的。作為一個面向?qū)ο蟮某绦蛟O計語言,java提供了java.lang.thread類來進行多線程編程,這個類提供了大量的方法給開發(fā)人員控制自己的各個線程,以后的討論都將圍繞這個類進行。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程的創(chuàng)建那么如何提供給java開

10、發(fā)人員線程執(zhí)行的代碼呢?通過thread類來實現(xiàn)。主要有兩種方法。繼承thread類,覆蓋方法run() 實現(xiàn)runnable接口 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社繼承thread類,覆蓋方法run()thread類最重要的方法是run()方法,它為thread類的start()方法所調(diào)用,并提供線程所要執(zhí)行的代碼。為了指定自己新的代碼,只需要覆蓋它即可,即在創(chuàng)建的thread類的子類中重寫run(),加入線程所要執(zhí)行的代碼。 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社繼承thread類,覆蓋方法run()該方法的步驟是:從thread類派生一個類,覆

11、蓋thread類中的run 方法,然后創(chuàng)建該子類的對象,再調(diào)用start方法啟動本線程?!纠?0-1】 線程的創(chuàng)建(光盤:源文件第10章例10-1.txt)。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社類“drawline”運行結(jié)果 類“drawline”運行結(jié)果 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社繼承thread類,覆蓋方法run()這種方法簡單明了,符合大家的習慣。但是,它也有一個很大的缺點,那就是如果類已經(jīng)從一個類繼承,則無法再繼承thread類。如果又不想建立一個新的類,應該怎么辦呢?這時可以采用另外一種方法來實現(xiàn):實現(xiàn)runnable接口。電腦基

12、礎實例上機系列叢書java程序設計教程清華大學出版社實現(xiàn)runnable接口 runnable接口只有一個方法run(),可以通過聲明自己的類實現(xiàn)runnable接口并提供這一方法,并將線程代碼寫入其中,就完成了這一部分的任務。但是runnable接口并沒有任何對線程的支持,還必須創(chuàng)建thread類的實例,這一點通過thread類的構造方法publicthread(runnable target)來實現(xiàn)。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社實現(xiàn)runnable接口【例10-2】 通過實現(xiàn)runnable接口來創(chuàng)建一個線程(光盤:源文件第10章例10-2.txt)。 類“t

13、hreaddemo”運行結(jié)果 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社實現(xiàn)runnable接口 嚴格地說,創(chuàng)建thread子類的實例也是可行的,但是必須注意的是,該子類必須沒有覆蓋thread類的run方法,否則該線程執(zhí)行的將是子類的run方法,而不是用以實現(xiàn)runnable 接口的類run方法,對此可以試驗一下。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社實現(xiàn)runnable接口 使用runnable接口來實現(xiàn)多線程使得開發(fā)人員能夠在一個類中包容所有的代碼,有利于封裝,但是其缺點在于只能使用一套代碼。若想創(chuàng)建多個線程并使各個線程執(zhí)行不同的代碼,則仍必須額外創(chuàng)建

14、類,在大多數(shù)情況下這也許還不如直接用多個類分別繼承thread更為恰當。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社如何實現(xiàn)多線程 java語言提供的實現(xiàn)多線程應用程序的方法主要有如下兩種。繼承thread類的多線程程序設計方法是使應用程序類繼承thread類并且在該類的run方法中實現(xiàn)并發(fā)性處理過程。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社如何實現(xiàn)多線程 多線程對象實現(xiàn)runnable接口并且在該類中定義用于啟動線程的run方法。后一種方法的好處在于多線程應用對象可以繼承其它對象而不是必須繼承thread類,從而能夠增加類定義的邏輯性。電腦基礎實例上機系列叢書

15、java程序設計教程清華大學出版社如何實現(xiàn)多線程 這兩種方法解決了java實現(xiàn)多線程的技術障礙,是多線程技術實現(xiàn)的核心部分。下面通過例子演示如何使用這兩種方法來實現(xiàn)多線程技術。【例10-3】 多線程的實現(xiàn)(光盤:源文件第10章例10-3.txt)。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社類“consumer”運行結(jié)果 類“consumer”運行結(jié)果 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社如何實現(xiàn)多線程從上面的程序代碼可以看出:多線程類consumer繼承java語言中的線程類thread,并且在main方法中創(chuàng)建3個consumer對象的實例。當調(diào)用對象實

16、例的start方法時,自動調(diào)用consumer類中定義的run方法啟動對象線程運行。 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社如何實現(xiàn)多線程線程運行的結(jié)果是每間隔ntime時間打印出對象實例中的字符串成員變量strconsumer的內(nèi)容。如果采用實現(xiàn)runnable接口來實現(xiàn)多線程應用程序,則代碼如下:電腦基礎實例上機系列叢書java程序設計教程清華大學出版社如何實現(xiàn)多線程從上述代碼可以看出:該類實現(xiàn)了runnable接口并且在該類中定義了run方法。這種多線程應用程序的實現(xiàn)方式與繼承thread類的多線程應用程序的重要區(qū)別在于啟動多線程對象的方法設計方法不同。在上述代碼中,

17、通過創(chuàng)建thread對象實例并且將應用對象作為創(chuàng)建thread類實例的參數(shù)。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程同步 java應用程序的多個線程共享同一進程的數(shù)據(jù)資源,多個用戶線程在并發(fā)運行過程中可能同時訪問具有共享的內(nèi)容。在java中定義了線程同步的概念,實現(xiàn)對共享資源的一致性維護。 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程同步下面以移動通信計費系統(tǒng)中線程間同步控制方法,說明java語言中多線程同步方式的實現(xiàn)過程。在沒有多線程同步控制策略條件下,客戶賬戶類定義代碼如下所示:電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程同步pub

18、lic class registeraccountfloat fbalance;/客戶繳費方法public void deposit(float ffees) fbalance += ffees; 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程同步/通話計費方法public void withdraw(float ffees) fbalance -= ffees; 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程同步這段代碼也許會被認為:完全能夠滿足計費系統(tǒng)實際的需要。確實,在單線程環(huán)境下該程序確實是可靠的。但是,多進程并發(fā)運行的情況是怎樣的呢?電腦基礎實例上機系

19、列叢書java程序設計教程清華大學出版社線程同步假設發(fā)生這種情況:客戶在客戶服務中心進行繳費的同時也正在利用移動電話進行通話,客戶通話結(jié)束時計費系統(tǒng)啟動計費進程,而同時客戶服務中心的工作人員也提交繳費進程運行??梢钥吹?,如果發(fā)生這種情況,對客戶賬戶的處理是有沖突的。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程同步如何解決這種問題呢?很簡單,在registeraccount類方法的定義中加上用于標識同步方法的關鍵字synchronized。這樣,在同步方法執(zhí)行過程中該方法涉及的共享資源將被加上共享鎖,以確保在方法運行期間只有該方法能夠?qū)蚕碣Y源進行訪問,直到該方法的線程運行結(jié)束

20、打開共享鎖,其它線程才能夠訪問這些共享資源。 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程同步在共享鎖沒有打開的時候,其它訪問共享資源的線程處于阻塞狀態(tài)。進行線程同步控制后的registeraccount類定義如下面代碼所示:電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程同步public class registeraccount float fbalance; public synchronized void deposit(float ffees) fbalance += ffees; public synchronized void withdraw(f

21、loat ffees) fbalance -= ffees; 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程同步從以上代碼可以看出:在對共享資源進行訪問的方法訪問屬性關鍵字(public)后附加同步定義關鍵字synchronized,使得同步方法在對共享資源訪問的時候,為這些資源附加共享鎖來控制方法執(zhí)行期間的資源獨占性,實現(xiàn)了應用系統(tǒng)數(shù)據(jù)資源的一致性管理和維護。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程死鎖 死鎖是這樣一種情形:多個線程同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放。由于線程被無限期地阻塞,因此程序不可能正常終止。死鎖的根源 隱性死鎖

22、 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社死鎖的根源導致死鎖的根源在于不適當?shù)剡\用synchronized關鍵字來管理線程對特定對象的訪問。前面介紹過,synchronized關鍵字的作用是,確保在某個時刻只有一個線程被允許執(zhí)行特定的代碼塊。因此,被允許執(zhí)行的線程首先必須擁有對變量或?qū)ο蟮脑L問權。 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社死鎖的根源當線程訪問對象時,線程會給對象加鎖,而這個鎖導致其它也想訪問同一對象的線程被阻塞,直至第一個線程釋放它加在對象上的鎖。由于這個原因,在使用synchronized關鍵詞時,很容易出現(xiàn)兩個線程互相等待對方做出某個動作

23、的情形。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社隱性死鎖隱性死鎖由于不規(guī)范的編程方式引起,但不一定每次測試運行時都會出現(xiàn)程序死鎖的情形。由于這個原因,一些隱性死鎖可能要到應用正式發(fā)布之后才會被發(fā)現(xiàn),因此它的危害性比普通死鎖更大。下面介紹兩種導致隱性死鎖的情況:加鎖次序和占有并等待。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社隱性死鎖1)加鎖次序當多個并發(fā)的線程分別試圖同時占有兩個鎖時,會出現(xiàn)加鎖次序沖突的情形。如果一個線程占有了另一個線程必需的鎖,就有可能出現(xiàn)死鎖??紤]下面的情形,threada和threadb兩個線程分別需要同時擁有l(wèi)ock_1、lock_2兩

24、個鎖,加鎖過程可能如下:電腦基礎實例上機系列叢書java程序設計教程清華大學出版社隱性死鎖threada獲得lock_1。threada被搶占,調(diào)度程序轉(zhuǎn)到threadb。threadb獲得lock_2。threadb被搶占,調(diào)度程序轉(zhuǎn)到threada。threada試圖獲得lock_2,但lock_2被threadb占有,所以threada阻塞。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社隱性死鎖調(diào)度程序轉(zhuǎn)到threadb。threadb試圖獲得lock_1,但lock_1被threada占有,所以threadb阻塞。threada和threadb死鎖。電腦基礎實例上機系列叢書

25、java程序設計教程清華大學出版社隱性死鎖必須指出的是,在代碼絲毫不做變動的情況下,有些時候上述死鎖過程不會出現(xiàn),調(diào)度程序可能讓其中一個線程同時獲得lock_1和lock_2兩個鎖,即線程獲取兩個鎖的過程沒有被中斷。在這種情形下,常規(guī)的死鎖檢測很難確定錯誤所在。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社隱性死鎖2)占有并等待如果一個線程獲得了一個鎖之后還要等待來自另一個線程的通知,可能出現(xiàn)另一種隱性死鎖。 以上代碼中,producer向隊列加入一項新的內(nèi)容后通知consumer,以便它處理新的內(nèi)容。 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社隱性死鎖問題在于,c

26、onsumer可能保持加在隊列上的鎖,阻止producer訪問隊列,甚至在consumer等待producer的通知時也會繼續(xù)保持鎖。這樣,由于producer不能向隊列添加新的內(nèi)容,而consumer卻在等待producer加入新內(nèi)容的通知,結(jié)果就導致死鎖。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社隱性死鎖在等待時占有的鎖是一種隱性的死鎖,這是因為事情可能按照比較理想的情況發(fā)展producer線程不需要被consumer占據(jù)的鎖。盡管如此,除非有絕對可靠的理由肯定producer線程永遠不需要該鎖,否則這種編程方式仍是不安全的。 電腦基礎實例上機系列叢書java程序設計教程清

27、華大學出版社隱性死鎖有時“占有并等待”還可能引發(fā)一連串的線程等待。要改正這個錯誤,只需修改consumer類,把wait()移出synchronized()即可。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程調(diào)度 對于多線程程序,每個線程的重要程度不盡相同,如多個線程在等待獲得cpu時間時,往往需要優(yōu)先級高的線程優(yōu)先搶占到cpu時間得以執(zhí)行;又如多個線程交替執(zhí)行時,優(yōu)先級決定了級別高的線程得到cpu的次數(shù)多一些且時間長一些。這樣,高優(yōu)先級的線程處理的任務效率就高一些。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程調(diào)度線程通常是搶占式的而不需要時間片分配進程。搶占

28、式調(diào)度模型就是許多線程屬于可以運行狀態(tài),但實際上只有一個線程在運行。該線程一直運行到它終止進入可運行狀態(tài)或是另一個具有更高優(yōu)先級的線程變成可運行狀態(tài)。 電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程調(diào)度后一種情況下,低優(yōu)先級的線程被高優(yōu)先級的線程搶占,高優(yōu)先級的線程獲得運行的機會。線程可以因為各種各樣的原因進入阻塞狀態(tài)。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程調(diào)度所有可運行的線程根據(jù)優(yōu)先級保持在不同的池中。一旦被阻塞的線程返回可運行狀態(tài),它將會被放回適當?shù)目蛇\行池中。非空最高優(yōu)先級池中的線程將獲得cpu時間。 java中線程的優(yōu)先級從低到高以整數(shù)110表示,共分為10級,設置優(yōu)先級是通過調(diào)用線程對象的setpriority()方法。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程調(diào)度java的object類提供了3個方法來實現(xiàn)線程的調(diào)度和通信。wait()等待:當前線程放棄監(jiān)視器并進入睡眠狀態(tài),直到其他線程進入同一監(jiān)視器并調(diào)用notify()為止。電腦基礎實例上機系列叢書java程序設計教程清華大學出版社線程調(diào)度notify()喚醒:喚醒同一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論