真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

JAVA中多線程編程方法的實(shí)例

JAVA中多線程編程方法的實(shí)例?這個(gè)問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過(guò)這個(gè)問題能讓你收獲頗深。下面是小編給大家?guī)?lái)的參考內(nèi)容,讓我們一起來(lái)看看吧!

袁州ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

 一、程序、進(jìn)程、線程

程序是一組指令的有序集合,也可以將其通俗地理解為若干行代碼。它本身沒有任何運(yùn)行的含義,它只是一個(gè)靜態(tài)的實(shí)體,它可能只是一個(gè)單純的文本文件,也有可能是經(jīng)過(guò)編譯之后生成的可執(zhí)行文件。
?從狹義來(lái)說(shuō),進(jìn)程是正在運(yùn)行的程序的實(shí)例;從廣義上來(lái)說(shuō),進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。進(jìn)程是操作系統(tǒng)進(jìn)行資源分配的基本單位。
?線程是進(jìn)程中可獨(dú)立執(zhí)行的最小單位,它也是處理器進(jìn)行獨(dú)立調(diào)度和分派的基本單位。一個(gè)進(jìn)程可以包含多個(gè)線程,每個(gè)線程執(zhí)行自己的任務(wù),同一個(gè)進(jìn)程中的所有線程共享該進(jìn)程中的資源,如內(nèi)存空間、文件句柄等。

二、多線程編程簡(jiǎn)介

1、什么是多線程編程

多線程編程技術(shù)是Java語(yǔ)言的重要特點(diǎn)。多線程編程的含義是將程序任務(wù)分成幾個(gè)并行的子任務(wù),并將這些子任務(wù)交給多個(gè)線程去執(zhí)行。
?多線程編程就是以線程為基本抽象單位的一種編程范式。但是,多線程編程又不僅僅是使用多個(gè)線程進(jìn)行編程那么簡(jiǎn)單,其自身又有需要解決的問題。多線程編程和面向?qū)ο缶幊淌强梢韵嗳莸?,即我們可以在面向?qū)ο缶幊痰幕A(chǔ)上實(shí)現(xiàn)多線程編程。事實(shí)上,Java平臺(tái)中的一個(gè)線程就是一個(gè)對(duì)象。

2、為什么要使用多線程編程

現(xiàn)在的計(jì)算機(jī)動(dòng)輒就是多處理器核心的,而每一個(gè)線程同一時(shí)間只能運(yùn)行在一個(gè)處理器上。如果只采用單線程進(jìn)行開發(fā),那么就不能充分利用多核處理器的資源來(lái)提高程序的執(zhí)行效率。而使用多線程進(jìn)行編程時(shí),不同的線程可以運(yùn)行在不同的處理器上。這樣一來(lái),不僅大大提高了對(duì)計(jì)算機(jī)資源的利用率,同時(shí)也提高了程序的執(zhí)行效率。

三、JAVA線程API簡(jiǎn)介

java.lang.Thread類就是Java平臺(tái)對(duì)線程的實(shí)現(xiàn)。Thread類或其子類的一個(gè)實(shí)例就是一個(gè)線程。

1、線程的創(chuàng)建、啟動(dòng)、運(yùn)行

在Java平臺(tái)中,創(chuàng)建一個(gè)線程就是創(chuàng)建一個(gè)Thread類(或其子類)的示例。每個(gè)線程都有其要執(zhí)行的任務(wù)。線程的任務(wù)處理邏輯可以在Thread類的run方法中直接實(shí)現(xiàn)或者通過(guò)該方法進(jìn)行調(diào)用,因此run方法相當(dāng)于線程的任務(wù)處理邏輯的入口方法,它應(yīng)該由Java虛擬機(jī)在運(yùn)行相應(yīng)線程時(shí)直接調(diào)用,而不應(yīng)該由應(yīng)用代碼進(jìn)行調(diào)用。
?運(yùn)行一個(gè)線程實(shí)際上就是讓Java虛擬機(jī)執(zhí)行該線程的run方法,從而使任務(wù)處理邏輯代碼得以執(zhí)行。如果一個(gè)線程沒有啟動(dòng),它的run方法是絕對(duì)不會(huì)被執(zhí)行的。為此,首先需要啟動(dòng)線程。Thread類的start方法的作用是啟動(dòng)相應(yīng)的線程。啟動(dòng)一個(gè)線程的實(shí)質(zhì)是請(qǐng)求虛擬機(jī)運(yùn)行相應(yīng)的線程,而這個(gè)線程具體何時(shí)能夠運(yùn)行是由線程調(diào)度器(線程調(diào)度器是操作系統(tǒng)的一部分)決定的。因此,調(diào)用線程的start方法并不意味著線程已經(jīng)開始運(yùn)行,這個(gè)線程可能馬上開始運(yùn)行,也有可能稍后才被運(yùn)行,也有可能永遠(yuǎn)不運(yùn)行。
?下面介紹兩種創(chuàng)建線程的方式(實(shí)際上還有其他方式,后續(xù)文章中會(huì)詳細(xì)介紹)。在此之前我們先來(lái)看一下Thread類的run方法的源碼:

// Code 1-1@Override
public void run() {
    if (target != null) {
        target.run();
    }
}

這個(gè)run方法是在接口Runnable中定義的,它不接受參數(shù)也沒有返回值。事實(shí)上Runnable接口中也只有這一個(gè)方法,因此這個(gè)接口是一個(gè)函數(shù)式接口,這意味著我們可以在需要Runnable的地方使用lambda表達(dá)式。Thread類實(shí)現(xiàn)了這個(gè)接口,因此它必須實(shí)現(xiàn)這個(gè)方法。target是Thread類中的一個(gè)域,它的類型也是Runnable。target域表示這個(gè)線程需要執(zhí)行的內(nèi)容,而Thread類的run方法所做的也只是執(zhí)行target的run方法。
?我們剛剛提到,Java虛擬機(jī)會(huì)自動(dòng)調(diào)用線程的run方法。但是,Thread類的run方法已經(jīng)定義好了,我們沒有辦法將自己需要執(zhí)行的代碼放在Thread類的run方法中。因此,我們可以考慮其他的方式來(lái)影響run方法的行為。第一種就是繼承Thread類并重寫run方法,這樣JVM在運(yùn)行線程時(shí)就會(huì)調(diào)用我們重寫的run方法而不是Thread類的run方法;第二種方法是將我們要執(zhí)行的代碼傳遞給Thread類的target方法,而剛好Thread類有幾個(gè)構(gòu)造器可以直接對(duì)target進(jìn)行賦值,這樣一來(lái),JVM在調(diào)用run方法時(shí)執(zhí)行的仍然是我們傳遞的代碼。
?在Java平臺(tái)中,每個(gè)線程都可以擁有自己默認(rèn)的名字,當(dāng)然我們也可以在構(gòu)造Thread類的實(shí)例時(shí)為我們的線程起一個(gè)名字,這個(gè)名字便于我們區(qū)分不同的線程。
?下面的代碼使用上述的兩種方式創(chuàng)建了兩個(gè)線程,它們要執(zhí)行的任務(wù)很簡(jiǎn)單——打印一行歡迎信息,并且要包含自己的名字。

public class WelcomeApp {
    public static void main(String[] args) {
        Thread thread1 = new WelcomeThread();
        Thread thread2 = new Thread(() -> System.out.println("2. Welcome, I'm " + Thread.currentThread().getName()));
        thread1.start();
        thread2.start();
    }
}class WelcomeThread extends Thread {
    @Override
    public void run() {
        System.out.println("1. Welcome, I'm " + Thread.currentThread().getName());
    }
}

下面是這個(gè)程序運(yùn)行時(shí)輸出的內(nèi)容:

1. Welcome, I'm Thread-0
2. Welcome, I'm Thread-1

多次運(yùn)行這個(gè)程序,我們可以發(fā)現(xiàn)這個(gè)程序的輸出也有可能是:

2. Welcome, I'm Thread-1
1. Welcome, I'm Thread-0

這說(shuō)明,雖然thread1的啟動(dòng)在thread2之前,但這并不意味著thread1會(huì)在thread2之前被運(yùn)行。
?不管采用哪種方式創(chuàng)建線程,一旦線程的run方法執(zhí)行(由JVM調(diào)用)結(jié)束,相應(yīng)線程的運(yùn)行也就結(jié)束了。當(dāng)然,run方法執(zhí)行結(jié)束包括正常結(jié)束(run方法正常返回)和代碼中拋出異常而導(dǎo)致的終止。運(yùn)行結(jié)束的線程所占用的資源(如內(nèi)存空間)會(huì)如同其他Java對(duì)象一樣被JVM回收。
?線程屬于“一次性用品”,我們不能通過(guò)重新調(diào)用一個(gè)已經(jīng)運(yùn)行結(jié)束的線程的start方法來(lái)使其重新運(yùn)行。事實(shí)上,start方法也只能夠被調(diào)用一次,多次調(diào)用同一個(gè)Thread實(shí)例的start方法會(huì)導(dǎo)致其拋出IllegalThreadStateException異常。

2、線程的屬性

線程的屬性包括線程的編號(hào)、名稱、類別和優(yōu)先級(jí), 詳情如下表所示:

JAVA中多線程編程方法的實(shí)例

上面提到了守護(hù)線程和用戶線程的概念,這里對(duì)它們做一個(gè)簡(jiǎn)要的說(shuō)明。按照線程是否會(huì)阻止Java虛擬機(jī)正常停止,我們可以將Java中的線程分為守護(hù)線程(Daemon Thread)和用戶線程(User Thread,也稱非守護(hù)線程)。線程的daemon屬性用于表示相應(yīng)線程是否為守護(hù)線程。用戶線程會(huì)阻止Java虛擬機(jī)的正常停止,即一個(gè)Java虛擬機(jī)只有在其所有用戶線程都運(yùn)行結(jié)束(即Thread.run()調(diào)用未結(jié)束)的情況下才能正常停止。而守護(hù)線程則不會(huì)影響Java虛擬機(jī)的正常停止,即應(yīng)用程序中有守護(hù)線程在運(yùn)行也不影響Java虛擬機(jī)的正常停止。因此,守護(hù)線程通常用于執(zhí)行一些重要性不是很高的任務(wù),例如用于監(jiān)視其他線程的運(yùn)行情況。
?當(dāng)然,如果Java虛擬機(jī)是被強(qiáng)制停止的,比如在Linux系統(tǒng)下使用kill命令強(qiáng)制終止一個(gè)Java虛擬機(jī)進(jìn)程,那么即使是用戶線程也無(wú)法阻止Java虛擬機(jī)的停止。

3、Thread類常用方法

JAVA中多線程編程方法的實(shí)例

Java中的任何一段代碼總是執(zhí)行在某個(gè)線程之中。執(zhí)行當(dāng)前代碼的線程就被稱為當(dāng)前線程,Thread.currentThread()可以返回當(dāng)前線程。由于同一段代碼可能被不同的線程執(zhí)行,因此當(dāng)前線程是相對(duì)的,即Thread.currentThread()的返回值在代碼實(shí)際運(yùn)行的時(shí)候可能對(duì)應(yīng)著不同的線程(對(duì)象)。
?join方法的作用相當(dāng)于執(zhí)行該方法的線程和線程調(diào)度器說(shuō):“我得先暫停一下,等到另外一個(gè)線程運(yùn)行結(jié)束后我才能繼續(xù)。”
?yield靜態(tài)方法的作用相當(dāng)于執(zhí)行該方法的線程對(duì)線程調(diào)度器說(shuō):“我現(xiàn)在不急,如果別人需要處理器資源的話先給它用吧。當(dāng)然,如果沒有其他人要用,我也不介意繼續(xù)占用?!?br/>?sleep靜態(tài)方法的作用相當(dāng)于執(zhí)行該方法的線程對(duì)線程調(diào)度器說(shuō):“我想小憩一會(huì)兒,過(guò)段時(shí)間再叫醒我繼續(xù)干活吧?!?/p>

4、Thread類中的廢棄方法

JAVA中多線程編程方法的實(shí)例

雖然這些方法并沒有相應(yīng)的替代品,但是可以使用其他辦法來(lái)實(shí)現(xiàn),我們會(huì)在后續(xù)文章中學(xué)習(xí)這部分內(nèi)容。

四、無(wú)處不在的線程

Java平臺(tái)本身就是一個(gè)多線程的平臺(tái)。除了Java開發(fā)人員自己創(chuàng)建和使用的線程,Java平臺(tái)中其他由Java虛擬機(jī)創(chuàng)建、使用的線程也隨處可見。當(dāng)然,這些線程也是各自有其處理任務(wù)。
?Java虛擬機(jī)啟動(dòng)的時(shí)候會(huì)創(chuàng)建一個(gè)主線程(main線程),該線程負(fù)責(zé)執(zhí)行Java程序的入口方法(main方法)。下面的程序打印出主線程的名稱:

public class MainThreadDemo {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName());
    }
}

??該程序會(huì)輸出“main”,這說(shuō)明main方法是由一個(gè)名為“main”的線程調(diào)用的,這個(gè)線程就是主線程,它是由JVM創(chuàng)建并啟動(dòng)的。
?在多線程編程中,弄清楚一段代碼具體是由哪個(gè)(或者哪種)線程去負(fù)責(zé)執(zhí)行的這點(diǎn)很重要,這關(guān)系到性能、線程安全等問題。本系列的后續(xù)文章會(huì)體現(xiàn)這點(diǎn)。
?Java 虛擬機(jī)垃圾回收器(Garbage Collector)負(fù)責(zé)對(duì)Java程序中不再使用的內(nèi)存空間進(jìn)行回收,而這個(gè)回收的動(dòng)作實(shí)際上也是通過(guò)專門的線程(垃圾回收線程)實(shí)現(xiàn)的,這些線程由Java虛擬機(jī)自行創(chuàng)建。
?為了提高Java代碼的執(zhí)行效率,Java虛擬機(jī)中的JIT(Just In Time)編譯器會(huì)動(dòng)態(tài)地將Java字節(jié)碼編譯為Java虛擬機(jī)宿主機(jī)處理器可直接執(zhí)行的機(jī)器碼。這個(gè)動(dòng)態(tài)編譯的過(guò)程實(shí)際上是由Java虛擬機(jī)創(chuàng)建的專門的線程負(fù)責(zé)執(zhí)行的。
?Java平臺(tái)中的線程隨處可見,這些線程各自都有其處理任務(wù)。

五、線程的層次關(guān)系

Java平臺(tái)中的線程不是孤立的,線程與線程之間總是存在一些聯(lián)系。假設(shè)線程A所執(zhí)行的代碼創(chuàng)建了線程B, 那么,習(xí)慣上我們稱線程B為線程A的子線程,相應(yīng)地線程A就被稱為線程B的父線程。例如, Code 1-2中的線程thread1和thread2是main線程的子線程,main線程是它們的父線程。子線程所執(zhí)行的代碼還可以創(chuàng)建其他線程,因此一個(gè)子線程也可以是其他線程的父線程。所以,父線程、子線程是一個(gè)相對(duì)的稱呼。理解線程的層次關(guān)系有助于我們理解Java應(yīng)用程序的結(jié)構(gòu),也有助于我們后續(xù)闡述其他概念。
?在Java平臺(tái)中,一個(gè)線程是否是一個(gè)守護(hù)線程默認(rèn)取決于其父線程:默認(rèn)情況下父線程是守護(hù)線程,則子線程也是守護(hù)線程;父線程是用戶線程,則子線程也是用戶線程。另外,父線程在創(chuàng)建子線程后啟動(dòng)子線程之前可以調(diào)用該線程的setDaemon方法,將相應(yīng)的線程設(shè)置為守護(hù)線程(或者用戶線程)。
?一個(gè)線程的優(yōu)先級(jí)默認(rèn)值為該線程的父線程的優(yōu)先級(jí),即如果我們沒有設(shè)置或者更改一個(gè)線程的優(yōu)先級(jí),那么這個(gè)線程的優(yōu)先級(jí)的值與父線程的優(yōu)先級(jí)的值相等。
?不過(guò),Java平臺(tái)中并沒有API用于獲取一個(gè)線程的父線程,或者獲取一個(gè)線程的所有子線程。并且,父線程和子線程之間的生命周期也沒有必然的聯(lián)系。比如父線程運(yùn)行結(jié)束后,子線程可以繼續(xù)運(yùn)行,子線程運(yùn)行結(jié)束也不妨礙其父線程繼續(xù)運(yùn)行。

六、線程的生命周期狀態(tài)

?在Java平臺(tái)中,一個(gè)線程從其創(chuàng)建、啟動(dòng)到其運(yùn)行結(jié)束的整個(gè)生命周期可能經(jīng)歷若干狀態(tài)。如下圖所示:

JAVA中多線程編程方法的實(shí)例

線程的狀態(tài)可以通過(guò)Thread.getState()調(diào)用來(lái)獲取。Thread.getState()的返回值類型Thread.State,它是Thread類內(nèi)部的一個(gè)枚舉類型。Thread.State所定義的線程狀態(tài)包括以下幾種:
?NEW:一個(gè)己創(chuàng)建而未啟動(dòng)的線程處于該狀態(tài)。由于一個(gè)線程實(shí)例只能夠被啟動(dòng)一次,因此一個(gè)線程只可能有一次處于該狀態(tài)。
?RUNNABLE:該狀態(tài)可以被看成一個(gè)復(fù)合狀態(tài),它包括兩個(gè)子狀態(tài):READY和RUNNING,但實(shí)際上Thread.State中并沒有定義這兩種狀態(tài)。前者表示處于該狀態(tài)的線程可以被線程調(diào)度器進(jìn)行調(diào)度而使之處于RUNNING狀態(tài)。后者表示處于該狀態(tài)的線程正在運(yùn)行,即相應(yīng)線程對(duì)象的run方法所對(duì)應(yīng)的指令正在由處理器執(zhí)行。執(zhí)行Thread.yield()的線程,其狀態(tài)可能會(huì)由RUNNING轉(zhuǎn)換為READY。處于READY子狀態(tài)的線程也被稱為活躍線程。
?BLOCKED:一個(gè)線程發(fā)起一個(gè)阻塞式I/0操作后,或者申請(qǐng)一個(gè)由其他線程持有的獨(dú)占資源(比如鎖)時(shí),相應(yīng)的線程會(huì)處于該狀態(tài)。處于BLOCKED狀態(tài)的線程并不會(huì)占用處理器資源。當(dāng)阻塞式1/0操作完成后,或者線程獲得了其申請(qǐng)的資源,該線程的狀態(tài)又可以轉(zhuǎn)換為RUNNABLE。
?WAITING:一個(gè)線程執(zhí)行了某些特定方法之后就會(huì)處于這種等待其他線程執(zhí)行另外一些特定操作的狀態(tài)。能夠使其執(zhí)行線程變更為WAITING狀態(tài)的方法包括:Object.wait()、Thread.join()和LockSupport.park(Object)。能夠使相應(yīng)線程從WAITING變更為RUNNABLE的相應(yīng)方法包括:Object.notify()/notifyAll()和LockSupport.unpark(Object))。
?TIMED_WAITING:該狀態(tài)和WAITING類似,差別在于處于該狀態(tài)的線程并非無(wú)限制地等待其他線程執(zhí)行特定操作,而是處于帶有時(shí)間限制的等待狀態(tài)。當(dāng)其他線程沒有在指定時(shí)間內(nèi)執(zhí)行該線程所期望的特定操作時(shí),該線程的狀態(tài)自動(dòng)轉(zhuǎn)換為RUNNABLE。
?TERMINATED:已經(jīng)執(zhí)行結(jié)束的線程處于該狀態(tài)。由于一個(gè)線程實(shí)例只能夠被啟動(dòng)一次,因此一個(gè)線程也只可能有一次處于該狀態(tài)。run方法正常返回或者由于拋出異常而提前終止都會(huì)導(dǎo)致相應(yīng)線程處于該狀態(tài)。
?一個(gè)線程在其整個(gè)生命周期中,只可能有一次處于NEW狀態(tài)和TERMINATED狀態(tài)。

七、多線程編程的優(yōu)勢(shì)

多線程編程具有以下優(yōu)勢(shì):

提高系統(tǒng)的吞吐率:多線程編程使得一個(gè)進(jìn)程中可以有多個(gè)并發(fā)(即同時(shí)進(jìn)行的)的操作。例如,當(dāng)一個(gè)線程因?yàn)镮/0操作而處于等待時(shí),其他線程仍然可以執(zhí)行其操作。

提高響應(yīng)性:在使用多線程編程的情況下,對(duì)于GUI軟件(如桌面應(yīng)用程序)而言,一個(gè)慢的操作(比如從服務(wù)器上下載一個(gè)大的文件)并不會(huì)導(dǎo)致軟件的界面出現(xiàn)被“凍住”的現(xiàn)象而無(wú)法響應(yīng)用戶的其他操作;對(duì)于Web應(yīng)用程序而言,一個(gè)請(qǐng)求的處理慢了并不會(huì)影響其他請(qǐng)求的處理。

充分利用多核處理器資源:如今多核處理器的設(shè)備越來(lái)越普及,就算是手機(jī)這樣的消費(fèi)類設(shè)備也普遍使用多核處理器。實(shí)施恰當(dāng)?shù)亩嗑€程編程有助于我們充分利用設(shè)備的多核處理器資源,從而避免了資源浪費(fèi)。

多線程編程也有自身的問題與風(fēng)險(xiǎn),包括以下幾個(gè)方面:

線程安全問題。多個(gè)線程共享數(shù)據(jù)的時(shí)候,如果沒有采取相應(yīng)的并發(fā)訪問控制措施,那么就可能產(chǎn)生數(shù)據(jù)一致性問題,如讀取臟數(shù)據(jù)(過(guò)期的數(shù)據(jù))、丟失更新(某些線程所做的更新被其他線程所做的更新覆蓋)等。

線程活性問題。一個(gè)線程從其創(chuàng)建到運(yùn)行結(jié)束的整個(gè)生命周期會(huì)經(jīng)歷若于狀態(tài)。從單個(gè)線程的角度來(lái)看,RUNNABLE狀態(tài)是我們所期望的狀態(tài)。但實(shí)際上,代碼編寫不當(dāng)可能導(dǎo)致某些線程一直處于等待其他線程釋放鎖的狀態(tài)(BLOCKED狀態(tài)),這種情況稱為死鎖(Deadlock)。當(dāng)然,一直忙碌的線程也可能會(huì)出現(xiàn)問題,它可能面臨活鎖(Livelock)問題,即一個(gè)線程一直在嘗試某個(gè)操作但就是無(wú)法進(jìn)展。另外,線程是一種稀缺的計(jì)算資源,一個(gè)系統(tǒng)所擁有的處理器數(shù)最相比于該系統(tǒng)中存在的線程數(shù)量而言總是少之又少的。某些情況下可能出現(xiàn)線程饑餓(Starvation)的問題,即某些線程永遠(yuǎn)無(wú)法獲取處理器執(zhí)行的機(jī)會(huì)而永遠(yuǎn)處于RUNNABLE狀態(tài)的READY子狀態(tài)。

上下文切換。處理器從執(zhí)行一個(gè)線程轉(zhuǎn)向執(zhí)行另外一個(gè)線程的時(shí)候操作系統(tǒng)所需要做的一個(gè)動(dòng)作被稱為上下文切換。由于處理器資源的稀缺性,因此上下文切換可以被看作多線程編程的必然副產(chǎn)物,它增加了系統(tǒng)的消耗,不利于系統(tǒng)的吞吐率。

感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)JAVA中多線程編程方法的實(shí)例大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)站題目:JAVA中多線程編程方法的實(shí)例
鏈接地址:http://weahome.cn/article/pedshd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部