bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

Scheduled時(shí)間調(diào)度是什么意思

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

創(chuàng)新互聯(lián)公司2013年開創(chuàng)至今,先為憑祥等服務(wù)建站,憑祥等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為憑祥企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

 Schedule,可以將它看成一個(gè)輕量級(jí)的Quartz,而且使用起來比Quartz簡單許多,它是spring團(tuán)隊(duì)開發(fā)的任務(wù)調(diào)度插件,它可以按照我們?cè)O(shè)計(jì)的時(shí)間周期執(zhí)行既定的任務(wù),首先來一個(gè)串行的 Schedule設(shè)計(jì):

第一步: 在自定義類中添加注解@EnableScheduling,啟動(dòng)scheduling,具體代碼如下

@SpringBootApplication
@MapperScan("com.xash.quartzDemo.mapper")
@EnableSwagger2
@EnableScheduling
public class SpringbootStartApplication {
          public static void main(String[] args) {
        	  
			SpringApplication.run(SpringbootStartApplication.class, args);
		}
}

第二步:創(chuàng)建一個(gè)類,并注入到spring中,讓該類實(shí)現(xiàn)SchedulingConfigurer,并重寫configureTasks方法,這樣可以實(shí)現(xiàn)基于多任務(wù)下的,多線程任務(wù)定都執(zhí)行方案:

具體代碼如下

package com.xash.quartzDemo.config;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.stereotype.Component;

import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.xash.quartzDemo.collection.utils.Modbus4jUtil;




@Component
public class TaskConfiguration implements SchedulingConfigurer {
	 @Autowired
	 private Modbus4jUtil Modbus4jUtil;
	 private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
      @Scheduled(fixedRate=100,initialDelay=10000)
     public void myTask() throws InterruptedException, ModbusTransportException, ErrorResponseException, ModbusInitException {
       System.out.println("當(dāng)前系統(tǒng)時(shí)間0:"+sdf.format(new Date()));
       String name=Thread.currentThread().getName();
		System.out.println("當(dāng)前執(zhí)行線程"+name);
     }
        @Scheduled(fixedDelayString="${com.test.scheduled}")
      public void myTask1() throws InterruptedException {
        System.out.println("當(dāng)前系統(tǒng)時(shí)間1:"+sdf.format(new Date()));
        String name=Thread.currentThread().getName();
		System.out.println("當(dāng)前執(zhí)行線程"+name);
      }
      @Scheduled(cron = "0/10 * * * * ?") // 每2秒鐘執(zhí)行一次
      public void myTask2() throws InterruptedException {
        System.out.println("當(dāng)前系統(tǒng)時(shí)間2:"+sdf.format(new Date()));
        String name=Thread.currentThread().getName();
		System.out.println("當(dāng)前執(zhí)行線程"+name);
   /*     throw new RuntimeException("運(yùn)行時(shí)異常");*/
      }
	@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
		taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
	}
	
	   /* @Override
	    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
	        taskRegistrar.setScheduler(taskExecutor());
	    }

	    @Bean(destroyMethod="shutdown")
	    public Executor taskExecutor() {
	        return Executors.newScheduledThreadPool(15); //指定線程池大小
	    }*/


}	

Executors該接口時(shí)Java線程池的頂級(jí)接口,具體Java線程池的原理分析如下:

JDK1.8中的ThreadPoolExecutor分析線程池對(duì)象的依賴關(guān)系:

Scheduled時(shí)間調(diào)度是什么意思

Executor:執(zhí)行提交的線程任務(wù)的對(duì)象。這個(gè)接口提供了一種將任務(wù)提交與每個(gè)任務(wù)將如何運(yùn)行實(shí)現(xiàn)了分離,包括線程使用、調(diào)度等細(xì)節(jié)。該接口只定義了一個(gè)execute()方法。

Scheduled時(shí)間調(diào)度是什么意思

ExecutorService

提供用于管理終止的方法如 shutDown()和shutDownNow()用于關(guān)閉線程池的方法以及判斷線程池是否關(guān)閉的方法如,isShutdown(),isTerminated()的方法

提供了可以生成用于跟蹤一個(gè)或多個(gè)異步任務(wù)進(jìn)度的方法如,invokeAll(),submit()。這些方法的返回值都是Future類型,可以獲取線程的執(zhí)行結(jié)果。

Scheduled時(shí)間調(diào)度是什么意思

ThreadPoolExecutor成員變量

Scheduled時(shí)間調(diào)度是什么意思

ctl是對(duì)線程池的運(yùn)行狀態(tài)和線程池中有效線程的數(shù)量進(jìn)行控制的一個(gè)字段,ctl是一個(gè)Integer, 它包含兩部分的信息: 高三位表示線程池的運(yùn)行狀態(tài) (runState) 和低29位表示線程池內(nèi)有效線程的數(shù)量 (workerCount),

線程池的生命周期,總共有五種狀態(tài)

RUNNING :能接受新提交的任務(wù),并且也能處理阻塞隊(duì)列中的任務(wù);

SHUTDOWN:關(guān)閉狀態(tài),不再接受新提交的任務(wù),但卻可以繼續(xù)處理阻塞隊(duì)列中已保存的任務(wù)。在線程池處于 RUNNING 狀態(tài)時(shí),調(diào)用 shutdown()方法會(huì)使線程池進(jìn)入到該狀態(tài)。(finalize() 方法在執(zhí)行過程中也會(huì)調(diào)用shutdown()方法進(jìn)入該狀態(tài));

STOP:不能接受新任務(wù),也不處理隊(duì)列中的任務(wù),會(huì)中斷正在處理任務(wù)的線程。在線程池處于 RUNNING 或 SHUTDOWN 狀態(tài)時(shí),調(diào)用 shutdownNow() 方法會(huì)使線程池進(jìn)入到該狀態(tài);

TIDYING:如果所有的任務(wù)都已終止了,workerCount (有效線程數(shù)) 為0,線程池進(jìn)入該狀態(tài)后會(huì)調(diào)用 terminated() 方法進(jìn)入TERMINATED 狀態(tài)。

TERMINATED:在terminated() 方法執(zhí)行完后進(jìn)入該狀態(tài),默認(rèn)terminated()方法中什么也沒有做。

進(jìn)入TERMINATED的條件如下:

線程池不是RUNNING狀態(tài);

線程池狀態(tài)不是TIDYING狀態(tài)或TERMINATED狀態(tài);

如果線程池狀態(tài)是SHUTDOWN并且workerQueue為空;

workerCount為0;

設(shè)置TIDYING狀態(tài)成功。

Scheduled時(shí)間調(diào)度是什么意思

還有三個(gè)關(guān)于ctl的方法

Scheduled時(shí)間調(diào)度是什么意思

runStateOf:獲取運(yùn)行狀態(tài);

workerCountOf:獲取活動(dòng)線程數(shù);

ctlOf:獲取運(yùn)行狀態(tài)和活動(dòng)線程數(shù)的值

ThreadPoolExecutor構(gòu)造函數(shù)

Scheduled時(shí)間調(diào)度是什么意思

下面解釋構(gòu)造函數(shù)的參數(shù)含義

corePoolSize:核心線程數(shù)量,當(dāng)有新任務(wù)在execute()方法提交時(shí),會(huì)執(zhí)行以下判斷:

a):如果運(yùn)行的線程少于 corePoolSize,則創(chuàng)建新線程來處理任務(wù),即使線程池中的其他線程是空閑的;

b):如果線程池中的線程數(shù)量大于等于 corePoolSize 且小于 maximumPoolSize,當(dāng)workQueue未滿的時(shí)候任務(wù)添加到workQueue中,當(dāng)workQueue滿時(shí)才創(chuàng)建新的線程去處理任務(wù);

c):如果設(shè)置的corePoolSize 和 maximumPoolSize相同,則創(chuàng)建的線程池的大小是固定的,這時(shí)如果有新任務(wù)提交,若workQueue未滿,則將請(qǐng)求放入workQueue中,等待有空閑的線程去從workQueue中取任務(wù)并處理;

d):如果運(yùn)行的線程數(shù)量大于等于maximumPoolSize,這時(shí)如果workQueue已經(jīng)滿了,則通過handler所指定的策略來處理任務(wù);

所以,任務(wù)提交時(shí),判斷的順序?yàn)?corePoolSize –> workQueue –> maximumPoolSize。

maximumPoolSize:最大線程數(shù)量;

workQueue:等待隊(duì)列,當(dāng)任務(wù)提交時(shí),如果線程池中的線程數(shù)量大于等于corePoolSize的時(shí)候,把該任務(wù)封裝成一個(gè)Worker對(duì)象放入等待隊(duì)列;

workQueue:保存等待執(zhí)行的任務(wù)的阻塞隊(duì)列,當(dāng)提交一個(gè)新的任務(wù)到線程池以后, 線程池會(huì)根據(jù)當(dāng)前線程池中正在運(yùn)行著的線程的數(shù)量來決定對(duì)該任務(wù)的處理方式,主要有以下幾種處理方式:

直接切換:這種方式常用的隊(duì)列是SynchronousQueue。

使用無界隊(duì)列:一般使用基于鏈表的阻塞隊(duì)列LinkedBlockingQueue。如果使用這種方式,那么線程池中能夠創(chuàng)建的最大線程數(shù)就是corePoolSize,而maximumPoolSize就不會(huì)起作用了。當(dāng)線程池中所有的核心線程都是RUNNING狀態(tài)時(shí),這時(shí)一個(gè)新的任務(wù)提交就會(huì)放入等待隊(duì)列中。

使用有界隊(duì)列:一般使用ArrayBlockingQueue。使用該方式可以將線程池的最大線程數(shù)量限制為maximumPoolSize,這樣能夠降低資源的消耗,但同時(shí)這種方式也使得線程池對(duì)線程的調(diào)度變得更困難,因?yàn)榫€程池和隊(duì)列的容量都是有限的值,所以要想使線程池處理任務(wù)的吞吐率達(dá)到一個(gè)相對(duì)合理的范圍,又想使線程調(diào)度相對(duì)簡單,并且還要盡可能的降低線程池對(duì)資源的消耗,就需要合理的設(shè)置這兩個(gè)數(shù)量。

如果要想降低系統(tǒng)資源的消耗(包括CPU的使用率,操作系統(tǒng)資源的消耗,上下文環(huán)境切換的開銷等), 可以設(shè)置較大的隊(duì)列容量和較小的線程池容量, 但這樣也會(huì)降低線程處理任務(wù)的吞吐量。

如果提交的任務(wù)經(jīng)常發(fā)生阻塞,那么可以考慮通過調(diào)用 setMaximumPoolSize() 方法來重新設(shè)定線程池的容量。

如果隊(duì)列的容量設(shè)置的較小,通常需要將線程池的容量設(shè)置大一點(diǎn),這樣CPU的使用率會(huì)相對(duì)的高一些。但如果線程池的容量設(shè)置的過大,則在提交的任務(wù)數(shù)量太多的情況下,并發(fā)量會(huì)增加,那么線程之間的調(diào)度就是一個(gè)要考慮的問題,因?yàn)檫@樣反而有可能降低處理任務(wù)的吞吐量。

keepAliveTime:線程池維護(hù)線程所允許的空閑時(shí)間。當(dāng)線程池中的線程數(shù)量大于corePoolSize的時(shí)候,如果這時(shí)沒有新的任務(wù)提交,核心線程外的線程不會(huì)立即銷毀,而是會(huì)等待,直到等待的時(shí)間超過了keepAliveTime;

threadFactory:它是ThreadFactory類型的變量,用來創(chuàng)建新線程。默認(rèn)使用Executors.defaultThreadFactory() 來創(chuàng)建線程。使用默認(rèn)的ThreadFactory來創(chuàng)建線程時(shí),會(huì)使新創(chuàng)建的線程具有相同的NORM_PRIORITY優(yōu)先級(jí)并且是非守護(hù)線程,同時(shí)也設(shè)置了線程的名稱。

handler:它是RejectedExecutionHandler類型的變量,表示線程池的飽和策略。如果阻塞隊(duì)列滿了并且沒有空閑的線程,這時(shí)如果繼續(xù)提交任務(wù),就需要采取一種策略處理該任務(wù)。線程池提供了4種策略:

AbortPolicy:直接拋出異常,這是默認(rèn)策略;

CallerRunsPolicy:用調(diào)用者所在的線程來執(zhí)行任務(wù);

DiscardOldestPolicy:丟棄阻塞隊(duì)列中靠最前的任務(wù),并執(zhí)行當(dāng)前任務(wù);

DiscardPolicy:直接丟棄任務(wù);

Scheduled時(shí)間調(diào)度是什么意思線程池中的核心線程和非核心線程,沒有什么區(qū)別,都是線程,只不過人為的規(guī)則線程池中的一部分線程叫核心線程

線程池的流程

Scheduled時(shí)間調(diào)度是什么意思

ThreadPoolExecutor執(zhí)行execute方法分下面4種情況。

1)如果當(dāng)前運(yùn)行的線程少于corePoolSize,則創(chuàng)建新線程來執(zhí)行任務(wù)(注意,執(zhí)行這一步驟需要獲取全局鎖)。

2)如果運(yùn)行的線程等于或多于corePoolSize,則將任務(wù)加入BlockingQueue。

3)如果無法將任務(wù)加入BlockingQueue(隊(duì)列已滿),則創(chuàng)建新的線程來處理任務(wù)(注意,執(zhí)行這一步驟需要獲取全局鎖)。

4)如果創(chuàng)建新線程將使當(dāng)前運(yùn)行的線程超出maximumPoolSize,任務(wù)將被拒絕,并調(diào)用

RejectedExecutionHandler.rejectedExecution()方法。

ThreadPoolExecutor采取上述步驟的總體設(shè)計(jì)思路,是為了在執(zhí)行execute()方法時(shí),盡可能地避免獲取全局鎖(那將會(huì)是一個(gè)嚴(yán)重的可伸縮瓶頸)。在ThreadPoolExecutor完成預(yù)熱之后當(dāng)前運(yùn)行的線程數(shù)大于等于corePoolSize),幾乎所有的execute()方法調(diào)用都是執(zhí)行步驟2,而步驟2不需要獲取全局鎖。

execute()源碼分析

為什么線程池中的線程可以重復(fù)利用?

我們知道線程在執(zhí)行完run()方法里面的邏輯后就會(huì)被GC回收,那么線程池是怎樣保持線程的存活,并且重復(fù)利用線程。

在線程池中使用Worker類來包裝向線程池中添加的Runnable線程任務(wù)。首先來分析一下addWorker()方法

在execute()方法中使用addWorker()方法的地方只有在添加核心線程和非核心線程的時(shí)候調(diào)用。

addWorker源碼分析

從上面可以看出這是一個(gè)添加線程的過程,并沒有看到,線程池是如何維護(hù)線程不被銷毀,從而達(dá)到重復(fù)利用的

從addWorker()中我們可以看到,向線程池中添加的Runnable被包裝成Worker對(duì)象,下面就來查看Worker對(duì)象,從中尋找為什么線程池中的線程可以重復(fù)利用的答案。

Worker源碼分析

Worker類繼承Runnable,和AbstractQueuedSynchronizer(這個(gè)類奠定了Java并發(fā)包的基礎(chǔ),很重要,可是我還沒有深入研究)

查看run()方法,調(diào)用runWorker,并將自身作為參數(shù)

查看runWorker(),在前面的addWorker()方法在最后是執(zhí)行了start()方法,也就是Worker的run()方法,進(jìn)而執(zhí)行了runWorker()方法。

這個(gè)while就是線程池中線程不被銷毀的原因所在,在Worker的run方法中,如果while一直執(zhí)行下去,那么Worker這個(gè)繼承了Runnable接口的線程就會(huì)一直執(zhí)行下去,而我們知道線程池中任務(wù)的載體是Worker,如果Worker一直執(zhí)行下去,就表示該載體可以一直存在,換的只是載體上我們通過execute()方法添加的Runnable任務(wù)而已。

那么如何保證while方法一直執(zhí)行下去

在第一次執(zhí)行完while后task設(shè)置為null,那么就要保證task=getTask()!=null

查看getTask(),從名字可以看出這是獲取一個(gè)任務(wù)。


通過代碼中的注釋,我們這就弄明白線程池的工作原理 以及線程池中如何保證線程(Worker)重復(fù)利用,不被銷毀。

Executors創(chuàng)建線程池的種類:

1.固定數(shù)量線程池(newFixedThreadPool)

創(chuàng)建使用固定線程數(shù)的FixedThreadPool,適用于為了滿足資源管理的需求,而需要限制當(dāng)前線程數(shù)量的應(yīng)用場景,它適用于負(fù)載比較重的服務(wù)器

Executors構(gòu)造newFixedThreadPool方式

查看源碼

corePoolSize = maximumPoolSize =初始化的參數(shù)

workQueue:使用無界隊(duì)列LinkedBlockingQueue鏈表阻塞隊(duì)列

keepAliveTime = 0 由于使用無界隊(duì)列LinkedBlockingQueue作為緩存隊(duì)列,所以當(dāng)corePoolSize滿后,后面添加的線程任務(wù)都會(huì)添加到LinkedBlockingQueue中去,所以maximumPoolSize 就失去了意義,這樣也就沒有必要設(shè)置空閑時(shí)間

使用無界隊(duì)列的影響,這也是為什么使用Eexcutors來創(chuàng)建線程池存在一定風(fēng)險(xiǎn)的原因

1)當(dāng)線程池中的線程數(shù)達(dá)到corePoolSize后,新任務(wù)將在無界隊(duì)列中等待,因此線程池中的線程數(shù)不會(huì)超過corePoolSize。

2)使用無界隊(duì)列時(shí)maximumPoolSize將是一個(gè)無效參數(shù)。

3)使用無界隊(duì)列時(shí)keepAliveTime將是一個(gè)無效參數(shù)。

4)由于使用無界隊(duì)列,運(yùn)行中的FixedThreadPool(未執(zhí)行方法shutdown()或shutdownNow())不會(huì)拒絕任務(wù)(不會(huì)調(diào)用RejectedExecutionHandler.rejectedExecution方法)。

代碼實(shí)例

結(jié)果:

為什么線程名稱會(huì)重復(fù):這正是線程池的原理,因?yàn)榫€程池會(huì)重復(fù)利用已創(chuàng)建的線程,當(dāng)一個(gè)任務(wù)Runnable被掛載到線程池中的一個(gè)線程,這個(gè)任務(wù)執(zhí)行完畢后,會(huì)有另一個(gè)任務(wù)繼續(xù)掛載到這個(gè)線程上面,所以會(huì)出現(xiàn)線程名稱重復(fù)。

單例線程池(newSingleThreadExecutor)

適用于需要保證順序地執(zhí)行各個(gè)任務(wù);并且在任意時(shí)間點(diǎn),不會(huì)有多個(gè)線程是活動(dòng)的應(yīng)用場景。

Executors構(gòu)造newSingleThreadExecutor方式

源代碼

corePoolSize = maximumPoolSize =1  由于是單例線程池,所以線程池中是有一個(gè)重用的線程

workQueue:使用無界隊(duì)列LinkedBlockingQueue鏈表阻塞隊(duì)列

keepAliveTime:0 原因上面已經(jīng)闡述

代碼實(shí)例

結(jié)果

只有一個(gè)可重用的線程,任務(wù)的執(zhí)行順序和添加順序一致

緩存線程池(newCachedThreadPool)

創(chuàng)建一個(gè)會(huì)根據(jù)需要?jiǎng)?chuàng)建新線程的,適用于執(zhí)行很多的短期異步任務(wù)的小程序,或者是負(fù)載較輕的服務(wù)器。

Executors構(gòu)造newCachedThreadPool方式

源代碼

corePoolSize:0 表示線程池中沒有核心線程,都是非核心線程

maximumPoolSize :線程池容量Integer最大值

keepAliveTime:60秒 由于沒有核心線程的存在,線程池中創(chuàng)建的線程都是非核心線程,所以設(shè)置空閑時(shí)間60秒,當(dāng)非核心線程60秒后沒有被重用,將會(huì)被銷毀,如果沒有線程提交給該線程池,超過空閑時(shí)間,該線程池就沒有非空閑線程,那么該線程池也就不會(huì)消耗過多的資源,

workQueue:SynchronousQueue是一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列。每一個(gè)put操作必須等待一個(gè)take操作,否則不能繼續(xù)添加元素。

代碼實(shí)例

結(jié)果

定時(shí)線程池(newScheduledThreadPool)

它主要用來在給定的延遲之后運(yùn)行任務(wù),或者定期執(zhí)行任務(wù),例如定時(shí)輪詢數(shù)據(jù)庫中的表的數(shù)據(jù)

Executors構(gòu)造newScheduledThreadPool方式

workQeueu:delayWorkQueue,使用延遲隊(duì)列作為緩存隊(duì)列

任務(wù)提交方式

schedule(Callable<E> callable, long delay, TimeUnit unit);

callable:提交Callable或者Runnable任務(wù)

delay:延遲時(shí)間

unit:時(shí)間級(jí)別

該方法表示在給定的delay延遲時(shí)間后執(zhí)行一次,有返回結(jié)果

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);

command:提交Runnable任務(wù)

initialDelay:初始延遲時(shí)間

period:表示連個(gè)任務(wù)連續(xù)執(zhí)行的時(shí)間周期,第一個(gè)任務(wù)開始到第二個(gè)任務(wù)的開始,包含了任務(wù)的執(zhí)行時(shí)間

unit:時(shí)間級(jí)別

該方法在initialDelay時(shí)間后開始周期性的按period時(shí)間間隔執(zhí)行任務(wù)

scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnit unit);

command:提交Runnable任務(wù)

initialDelay:初始延遲時(shí)間

delay:表示延遲時(shí)間 第一個(gè)任務(wù)結(jié)束到第二個(gè)任務(wù)開始的時(shí)間間隔

unit:時(shí)間級(jí)別

單例延遲線程池(newSingleThreadScheduledExecutor)

Executors構(gòu)造newSingleThreadScheduledExecutor方式

corePoolSize :1由于是單例線程池,所以核心線程為1,線程池中只有一個(gè)重用線程

總結(jié):利用sping的線程調(diào)度結(jié)合java的線程池可以實(shí)現(xiàn)多線程的任務(wù)調(diào)度

“Scheduled時(shí)間調(diào)度是什么意思”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

分享題目:Scheduled時(shí)間調(diào)度是什么意思
URL地址:http://vcdvsql.cn/article6/jhicig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)網(wǎng)站內(nèi)鏈移動(dòng)網(wǎng)站建設(shè)云服務(wù)器品牌網(wǎng)站建設(shè)全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司