溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java中線(xiàn)程的知識(shí)點(diǎn)有哪些

發(fā)布時(shí)間:2022-01-06 21:06:28 來(lái)源:億速云 閱讀:144 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容介紹了“Java中線(xiàn)程的知識(shí)點(diǎn)有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1  .資源沖突,如果兩個(gè)線(xiàn)程確實(shí)是在修改同一個(gè)對(duì)象,共享資源的沖突將變得更糟糕,因?yàn)檫@有可能把對(duì)象設(shè)置成不正確的狀態(tài)。通過(guò)簡(jiǎn)單的“信號(hào)量”概念引入, 把它看作是在兩個(gè)線(xiàn)程之間進(jìn)行通信的標(biāo)志對(duì)象。如果信號(hào)量的值是零,則它監(jiān)控的資源是可用的,但如果這個(gè)值是非零的,則被監(jiān)控的資源不可用,所以線(xiàn)程必須 等待。當(dāng)資源可用的時(shí)候,線(xiàn)程增加信號(hào)量的值,然后繼續(xù)執(zhí)行這個(gè)被監(jiān)控的資源。把增加和減少信號(hào)量的操作定義為原子操作,這樣就可保證兩個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)同 一資源的時(shí)候不至于沖突。 
定義一個(gè)簡(jiǎn)化的信號(hào)量:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Semaphore</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">implements</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Invariant</span>{</span>     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">volatile</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> semaphore = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">boolean</span> <span class="hljs-title" style="box-sizing: border-box;">available</span>(){<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> semaphore==<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;}     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">acquire</span>(){ ++semaphore; }     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">release</span>(){ --semaphore; }     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> InvariantSate <span class="hljs-title" style="box-sizing: border-box;">invariant</span>(){         <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> val = semaphore;         <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>( val==<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>||val==<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> )             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> InvariantOk();         <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> InvariantFailure(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Integer(val));     } }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li></ul>

(其中Invariant接口在博客:線(xiàn)程測(cè)試框架已給出)將semaphore字段設(shè)置為volatile ,以確保編譯器不會(huì)對(duì)任何讀取此值的操作進(jìn)行優(yōu)化。

2.解決共享資源競(jìng)爭(zhēng),之前說(shuō)過(guò),可以通過(guò)yield()和setPriority()來(lái)給線(xiàn)程調(diào)度機(jī)制提供建議,但這些建議未必會(huì)有多大的效果,這取決 與你的具體平臺(tái)和JVM實(shí)現(xiàn)。Java以提供關(guān)鍵字 synchronized  的形式,為防止資源沖突提供了內(nèi)置支持。共享資源一般是以對(duì)象的形式存在的內(nèi)存判斷,但也可以是文件,輸入/輸出端口,或者是打印機(jī)。要控制對(duì)共享資源的 訪(fǎng)問(wèn),得先把它包裝進(jìn)一個(gè)對(duì)象。然后把所有要訪(fǎng)問(wèn)這個(gè)資源的方法標(biāo)記為synchronized。即一旦某個(gè)線(xiàn)程處于一個(gè)標(biāo)記為synchronized 的方法中,那么在這個(gè)線(xiàn)程從該方法返回之前,其他所有要調(diào)用類(lèi)中任何標(biāo)記為synchronized方法的線(xiàn)程都會(huì)被阻塞。 
每個(gè)對(duì)象都含有單一的鎖(也稱(chēng)為監(jiān)視器),這個(gè)鎖本身就是對(duì)象的一部分(不用寫(xiě)任何特殊代碼)。當(dāng)在對(duì)象上調(diào)用其任意synchronized方法的時(shí) 候,此對(duì)象都被加鎖,這時(shí)該對(duì)象上的其他synchronized方法也只能等到前一個(gè)方法調(diào)用完并釋放了鎖之后才能被調(diào)用。 
針對(duì)每一個(gè)類(lèi)也有一個(gè)鎖(作為類(lèi)的Class對(duì)象的一部分),所以synchronized static 方法可以在類(lèi)的范圍內(nèi)防止對(duì)static數(shù)據(jù)的并發(fā)訪(fǎng)問(wèn)。

3.原子操作,即不能被線(xiàn)程調(diào)度機(jī)制中斷的操作;一旦操作開(kāi)始,那么它一定可以在可能發(fā)生的“上下文切換”之前(切換到其他線(xiàn)程執(zhí)行)執(zhí)行完畢。如果問(wèn)題 中的變量類(lèi)型是除long或double以外的基本類(lèi)型,對(duì)這種變量進(jìn)行簡(jiǎn)單的賦值或返回值操作的時(shí)候,才算是原子操作。然而,只要給long或 double加上volatile,操作就是原子的了。注意,在JVM中的自增加操作并不是原子操作,它牽涉到一次讀和一次寫(xiě),所以即使在這樣的簡(jiǎn)單操作 中,也為線(xiàn)程出問(wèn)題提供了空間。線(xiàn)程工作時(shí),每個(gè)線(xiàn)程都可能擁有一個(gè)本地棧來(lái)維護(hù)一些變量的復(fù)本,如果把一個(gè)變量定義成volatile的,就等于告訴編 譯器不要做任何優(yōu)化,直接在主存操作變量。

4.保證上述問(wèn)題解決,做安全的做法就是使用下面的方法: 
1)如果要對(duì)類(lèi)中的某個(gè)方法進(jìn)行同步控制,***同步所有方法。如果忽略了其中一個(gè),通常很難確定這么做是否會(huì)有負(fù)面影響。 
2)當(dāng)去除方法的同步控制時(shí),要非常小心。通常這么做是基于性能方面的考慮,但在JDK1.3和JDK1.4中,同步控制所需的負(fù)擔(dān)已經(jīng)大大的減少。此外,只應(yīng)在使用性能評(píng)價(jià)工具證實(shí)了同步控制確實(shí)是性能瓶頸的時(shí)候,才這么做。

5.如果只是希望防止多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)方法內(nèi)部的部分代碼而不是防止整個(gè)方法,可以使用synchronized關(guān)鍵字來(lái)分離代碼段,這種方式被稱(chēng)為“臨界區(qū)”,此時(shí),synchronized被用來(lái)指定某個(gè)對(duì)象,此對(duì)象的鎖被用來(lái)對(duì)花括號(hào)內(nèi)的代碼進(jìn)行同步控制:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;">        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">synchronized</span>(syncObject){             <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// This code can be accessed</span>             <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//by only one thread at a time</span>         }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

使用同步控制塊,而不是對(duì)整個(gè)方法進(jìn)行同步控制,可以使多個(gè)線(xiàn)程訪(fǎng)問(wèn)對(duì)象的時(shí)間性能得到顯著的提高。要注意的是,當(dāng)對(duì)象中的方法在不同的鎖上同步的時(shí)候,兩個(gè)線(xiàn)程可以訪(fǎng)問(wèn)同一個(gè)對(duì)象:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;">class DualSynch {      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> Object syncObject = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Object();      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> synchronized <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">f</span>() {         System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Inside f()"</span>);         <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {             Thread.sleep(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">500</span>);         } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (InterruptedException e) {             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> RuntimeException(e);         }         System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"leaving f()"</span>);     }      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">g</span>() {          synchronized (syncObject) {             System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Inside g()"</span>);             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {                 Thread.sleep(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">500</span>);             } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (InterruptedException e) {                 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> RuntimeException(e);             }             System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"leaving g()"</span>);         }     } }  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> SyncObject{      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args){         final DualSynch ds = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> DualSynch();          <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Thread(){             <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">run</span>(){                 ds.f();             }         }.start();;          ds.g();     } }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li></ul>

DualSync對(duì)象的f()方法在this上同步(通過(guò)在整個(gè)方法同步),g()的同步控制塊在syncObject對(duì)象上同步,因此,兩個(gè)同步控制相 互獨(dú)立,兩個(gè)方法同時(shí)魚(yú)腥,所以它們沒(méi)有在對(duì)象的同步控制上阻塞。因此,必須把訪(fǎng)問(wèn)共享資源的代碼段包裝進(jìn)一個(gè)合適的同步控制塊。

6.線(xiàn)程有四個(gè)狀態(tài):新建、就緒、死亡、阻塞(程序能夠運(yùn)行,但有某個(gè)條件阻止它運(yùn)行)。進(jìn)入阻塞狀態(tài)的原因: 
1)通過(guò)調(diào)用sleep(miliseconds)使線(xiàn)程進(jìn)入休眠狀態(tài),在指定的時(shí)間內(nèi)不運(yùn)行。 
2)調(diào)用wait()使線(xiàn)程掛起,直到線(xiàn)程得道了notify()或notifyAll()消息,線(xiàn)程才會(huì)進(jìn)入就緒狀態(tài)。 
3)線(xiàn)程在等待某個(gè)輸入/輸出完成。 
4)線(xiàn)程在某個(gè)對(duì)象上調(diào)用其同步方法,但是對(duì)象鎖不可用。

7.線(xiàn)程之間為避免沖突,通過(guò)“握手機(jī)制”來(lái)進(jìn)行的,這種握手可以通過(guò)Object的方法wait()和notify()來(lái)安全的實(shí)現(xiàn)。注意,調(diào)用 sleep()的時(shí)候鎖并沒(méi)有被釋放,而調(diào)用wait()方法的確釋放了鎖,這就意味著,再調(diào)用wait()期間,可以調(diào)用線(xiàn)程對(duì)象中的其他同步控制方 法,當(dāng)一個(gè)線(xiàn)程在方法里遇到了對(duì)wait()的調(diào)用的時(shí)候,線(xiàn)程的執(zhí)行被掛起,對(duì)象上的鎖被釋放。 
wait()有兩種形式,一種與sleep()一樣接受毫秒數(shù),不同之處: 
1)在wait()期間對(duì)象鎖是釋放的。 
2)可以通過(guò)notify()、notifyAll(),或者指令時(shí)間到期,從wait()中回復(fù)執(zhí)行。 
另一種是不帶參數(shù)的,wait()將***等下去,知道接收到notify()或notifyAll()的消息。

8.wait()、notify()、notifyAll()這些方法是基類(lèi)Object的一部分,而不是像sleep()那樣屬于Thread的一部 分。因?yàn)檫@些功能要用到的鎖也是所有對(duì)象的一部分,所以,你可以把wait()方法放在任何同步控制方法里,不用考慮這個(gè)類(lèi)是否繼承Thread或者實(shí)現(xiàn) Runnable接口。只能在同步控制方法或同步控制塊中調(diào)用wait()、notify()、notifyAll()的線(xiàn)程在調(diào)用這些方法前必須“擁 有”(獲取)對(duì)象的鎖。(sleep不用操作鎖,所以可以在非同步控制方法里調(diào)用)。

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">synchronized</span>(x){     x.notify(); }</code>

“Java中線(xiàn)程的知識(shí)點(diǎn)有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI