最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何優(yōu)雅關(guān)閉異步中的ExecutorService

 更新時(shí)間:2025年02月08日 08:21:23   作者:Huooya  
在并發(fā)編程領(lǐng)域,Java的ExecutorService是線程池管理的關(guān)鍵接口,這篇文章主要為大家介紹了如何優(yōu)雅關(guān)閉異步中的ExecutorService,需要的可以了解下

1.ExecutorService的核心價(jià)值

在并發(fā)編程領(lǐng)域,Java的ExecutorService(位于java.util.concurrent包)是線程池管理的關(guān)鍵接口。作為Executor框架的核心組件,它通過(guò)解耦任務(wù)提交與執(zhí)行機(jī)制,為開(kāi)發(fā)者提供了:

  • 線程生命周期管理自動(dòng)化
  • 任務(wù)隊(duì)列智能調(diào)度
  • 資源復(fù)用優(yōu)化機(jī)制
  • 異步執(zhí)行結(jié)果追蹤能力

2.關(guān)閉機(jī)制的必要性

不正確的線程池關(guān)閉會(huì)導(dǎo)致:

  • 內(nèi)存泄漏(滯留線程無(wú)法回收)
  • 應(yīng)用無(wú)法正常終止(非守護(hù)線程保持活躍)
  • 任務(wù)狀態(tài)不一致(突然中斷導(dǎo)致數(shù)據(jù)問(wèn)題)
  • 系統(tǒng)資源耗盡(無(wú)限制線程創(chuàng)建)

3.shutdown()方法詳解

3.1 方法特性

void shutdown()

狀態(tài)轉(zhuǎn)換

將線程池狀態(tài)設(shè)置為SHUTDOWN,觸發(fā)以下行為:

  • 拒絕新任務(wù)提交(觸發(fā)RejectedExecutionHandler)
  • 繼續(xù)執(zhí)行已存在的任務(wù):
    • 正在執(zhí)行的任務(wù)(running tasks)
    • 等待隊(duì)列中的任務(wù)(queued tasks)

典型應(yīng)用場(chǎng)景

ExecutorService executor = Executors.newFixedThreadPool(4);
// 提交多個(gè)任務(wù)...
executor.shutdown();

try {
    if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
        System.err.println("仍有任務(wù)未在時(shí)限內(nèi)完成");
    }
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
}

3.2 內(nèi)部運(yùn)作機(jī)制

  • 原子性狀態(tài)更新:CAS操作修改線程池控制狀態(tài)
  • 中斷空閑線程:僅中斷等待任務(wù)的Worker線程
  • 隊(duì)列消費(fèi)保證:完全處理BlockingQueue中的剩余任務(wù)

4.shutdownNow()方法剖析

4.1 方法定義

List<Runnable> shutdownNow()

狀態(tài)轉(zhuǎn)換

將線程池狀態(tài)設(shè)置為STOP,觸發(fā):

  • 立即拒絕新任務(wù)
  • 中斷所有工作線程(無(wú)論是否在執(zhí)行任務(wù))
  • 清空任務(wù)隊(duì)列,返回未執(zhí)行任務(wù)列表

4.2 中斷處理要點(diǎn)

executor.shutdownNow();
// 典型返回值處理
List<Runnable> unprocessed = executor.shutdownNow();
if (!unprocessed.isEmpty()) {
    logger.warn("丟棄{}個(gè)未執(zhí)行任務(wù)", unprocessed.size());
}

任務(wù)中斷條件

只有當(dāng)任務(wù)代碼正確處理中斷時(shí)才能被終止:

class InterruptibleTask implements Runnable {
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            // 執(zhí)行可中斷的操作
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt(); // 重置中斷狀態(tài)
                break;
            }
        }
    }
}

5.對(duì)比分析

特性shutdown()shutdownNow()
新任務(wù)接受立即拒絕立即拒絕
運(yùn)行中任務(wù)處理等待完成嘗試中斷
隊(duì)列任務(wù)處理全部執(zhí)行清除并返回
返回值void未執(zhí)行任務(wù)列表
適用場(chǎng)景優(yōu)雅關(guān)閉緊急終止
線程中斷策略僅中斷空閑線程強(qiáng)制中斷所有線程

6.最佳實(shí)踐代碼示例

6.1 標(biāo)準(zhǔn)關(guān)閉模板

public class GracefulShutdownExample {
    // 定義超時(shí)時(shí)間和時(shí)間單位(30秒)
    private static final int TIMEOUT = 30;
    private static final TimeUnit UNIT = TimeUnit.SECONDS;

    // 執(zhí)行任務(wù)的方法,接收一個(gè)任務(wù)列表并將其提交給線程池執(zhí)行
    public void executeTasks(List<Runnable> tasks) {
        // 創(chuàng)建一個(gè)固定大小的線程池,大小為系統(tǒng)可用處理器核心數(shù)
        ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
        
        try {
            // 將任務(wù)列表中的每個(gè)任務(wù)提交到線程池
            tasks.forEach(executor::submit);
        } finally {
            // 在所有任務(wù)提交完后,禁用線程池接收新任務(wù),開(kāi)始優(yōu)雅關(guān)閉線程池
            executor.shutdown(); // 禁止再提交新任務(wù)
            try {
                // 等待線程池中的任務(wù)在指定超時(shí)內(nèi)完成,如果超時(shí)未完成,則強(qiáng)制關(guān)閉線程池
                if (!executor.awaitTermination(TIMEOUT, UNIT)) {
                    // 如果未能在超時(shí)內(nèi)完成,則調(diào)用 shutdownNow() 強(qiáng)制終止所有活動(dòng)任務(wù)
                    List<Runnable> unfinished = executor.shutdownNow();
                    // 處理未完成的任務(wù),例如記錄日志或重新提交
                    handleUnfinishedTasks(unfinished);
                }
            } catch (InterruptedException e) {
                // 如果在等待終止時(shí)被中斷,恢復(fù)中斷狀態(tài)并強(qiáng)制關(guān)閉線程池
                Thread.currentThread().interrupt();
                executor.shutdownNow();
            }
        }
    }
    
    // 處理未完成任務(wù)的方法,這里我們打印未完成任務(wù)的數(shù)量
    private void handleUnfinishedTasks(List<Runnable> tasks) {
        // 如果有未完成的任務(wù),打印任務(wù)數(shù)量并執(zhí)行額外的處理
        if (!tasks.isEmpty()) {
            System.out.println("未完成任務(wù)數(shù): " + tasks.size());
            // 可在此處記錄日志、重新排隊(duì)未完成的任務(wù)等
        }
    }

}

構(gòu)造線程池: Executors.newFixedThreadPool() 創(chuàng)建一個(gè)固定大小的線程池,大小為系統(tǒng)可用的處理器核心數(shù),這樣可以更高效地利用 CPU 資源。

提交任務(wù): 使用 tasks.forEach(executor::submit) 提交每個(gè)任務(wù)到線程池中執(zhí)行。

優(yōu)雅關(guān)閉線程池:

  • executor.shutdown() 禁用線程池接收新任務(wù),但仍會(huì)執(zhí)行已經(jīng)提交的任務(wù)。
  • awaitTermination() 方法用于等待所有任務(wù)執(zhí)行完成。如果超時(shí)后任務(wù)未完成,則調(diào)用 shutdownNow() 強(qiáng)制關(guān)閉線程池,停止所有正在運(yùn)行的任務(wù),并返回未完成的任務(wù)。

處理中斷: 如果在等待終止過(guò)程中發(fā)生 InterruptedException,線程會(huì)恢復(fù)中斷狀態(tài),并且強(qiáng)制關(guān)閉線程池。

處理未完成任務(wù): handleUnfinishedTasks() 方法會(huì)處理未完成的任務(wù),比如記錄日志或者重新排隊(duì)未完成的任務(wù)。

6.2 帶回調(diào)的增強(qiáng)實(shí)現(xiàn)

public class EnhancedExecutorManager {
    // 定義線程池對(duì)象
    private final ExecutorService executor;
    // 定義超時(shí)時(shí)間及單位
    private final long timeout;
    private final TimeUnit unit;

    // 構(gòu)造函數(shù),初始化線程池并設(shè)置超時(shí)時(shí)間和單位
    public EnhancedExecutorManager(int corePoolSize, long timeout, TimeUnit unit) {
        // 創(chuàng)建一個(gè)核心池大小為 corePoolSize,最大池大小為 corePoolSize * 2,最大空閑時(shí)間 60秒的線程池
        this.executor = new ThreadPoolExecutor(
            corePoolSize,                             // 核心線程池大小
            corePoolSize * 2,                         // 最大線程池大小
            60L, TimeUnit.SECONDS,                    // 空閑線程的存活時(shí)間
            new LinkedBlockingQueue<>(1000),          // 使用容量為 1000 的隊(duì)列來(lái)緩存任務(wù)
            new CustomThreadFactory(),                // 自定義線程工廠
            new ThreadPoolExecutor.CallerRunsPolicy() // 當(dāng)任務(wù)無(wú)法提交時(shí),調(diào)用者線程執(zhí)行該任務(wù)
        );
        this.timeout = timeout;                     // 設(shè)置超時(shí)時(shí)間
        this.unit = unit;                           // 設(shè)置超時(shí)時(shí)間單位
    }
    
    // 優(yōu)雅關(guān)閉線程池的方法
    public void shutdown() {
        executor.shutdown(); // 首先嘗試正常關(guān)閉線程池,不再接收新的任務(wù)
        
        try {
            // 如果線程池未能在指定的超時(shí)時(shí)間內(nèi)終止,則強(qiáng)制關(guān)閉
            if (!executor.awaitTermination(timeout, unit)) {
                System.out.println("強(qiáng)制終止線程池...");
                // 強(qiáng)制停止所有正在執(zhí)行的任務(wù)并返回丟棄的任務(wù)列表
                List<Runnable> droppedTasks = executor.shutdownNow();
                System.out.println("丟棄任務(wù)數(shù): " + droppedTasks.size());
            }
        } catch (InterruptedException e) {
            // 如果在等待過(guò)程中線程池關(guān)閉操作被中斷,立即強(qiáng)制關(guān)閉并恢復(fù)中斷狀態(tài)
            executor.shutdownNow();
            Thread.currentThread().interrupt();
        }
    }
    
    // 自定義線程工廠類,用于創(chuàng)建線程
    private static class CustomThreadFactory implements ThreadFactory {
        private static final AtomicInteger poolNumber = new AtomicInteger(1); // 線程池編號(hào),用于生成線程名
        private final ThreadGroup group; // 線程組
        private final AtomicInteger threadNumber = new AtomicInteger(1); // 線程編號(hào)
        private final String namePrefix; // 線程名稱前綴
    
        CustomThreadFactory() {
            // 獲取當(dāng)前系統(tǒng)的安全管理器,如果沒(méi)有,則使用當(dāng)前線程的線程組
            SecurityManager s = System.getSecurityManager();
            group = (s != null) ? s.getThreadGroup() :
                                  Thread.currentThread().getThreadGroup();
            // 設(shè)置線程池的名稱前綴
            namePrefix = "pool-" +
                          poolNumber.getAndIncrement() + // 線程池編號(hào)遞增
                         "-thread-";
        }
    
        // 創(chuàng)建新線程的方法
        public Thread newThread(Runnable r) {
            // 創(chuàng)建新的線程,線程組、名稱及優(yōu)先級(jí)均已設(shè)置
            Thread t = new Thread(group, r,
                                  namePrefix + threadNumber.getAndIncrement(),
                                  0); // 默認(rèn)優(yōu)先級(jí)和daemon設(shè)置
            // 如果線程是守護(hù)線程,則將其設(shè)置為非守護(hù)線程
            if (t.isDaemon())
                t.setDaemon(false);
            // 設(shè)置線程優(yōu)先級(jí)為默認(rèn)
            if (t.getPriority() != Thread.NORM_PRIORITY)
                t.setPriority(Thread.NORM_PRIORITY);
            return t; // 返回新創(chuàng)建的線程
        }
    }
}

線程池初始化:

  • EnhancedExecutorManager 的構(gòu)造方法使用 ThreadPoolExecutor 創(chuàng)建一個(gè)線程池,線程池大小通過(guò) corePoolSize 參數(shù)傳遞。線程池的最大線程數(shù)是核心線程數(shù)的兩倍。
  • LinkedBlockingQueue 用作任務(wù)隊(duì)列,大小為 1000。若任務(wù)量超過(guò)隊(duì)列容量,則使用 CallerRunsPolicy 策略,即由提交任務(wù)的線程執(zhí)行該任務(wù)。
  • 使用自定義的 CustomThreadFactory 來(lái)創(chuàng)建線程。

優(yōu)雅關(guān)閉線程池:

  • shutdown() 方法首先調(diào)用 executor.shutdown() 來(lái)拒絕接受新的任務(wù),然后等待線程池在指定的超時(shí)時(shí)間內(nèi)關(guān)閉。
  • 如果線程池在超時(shí)時(shí)間內(nèi)未能正常關(guān)閉,則調(diào)用 shutdownNow() 強(qiáng)制關(guān)閉并丟棄未執(zhí)行的任務(wù),同時(shí)輸出丟棄任務(wù)的數(shù)量。
  • 如果在等待關(guān)閉過(guò)程中發(fā)生 InterruptedException,會(huì)強(qiáng)制關(guān)閉線程池,并恢復(fù)中斷狀態(tài)。

自定義線程工廠:

  • CustomThreadFactory 通過(guò)實(shí)現(xiàn) ThreadFactory 接口來(lái)定義創(chuàng)建線程的行為,主要包括線程組、線程名稱、守護(hù)線程狀態(tài)和線程優(yōu)先級(jí)的配置。
  • 每個(gè)線程的名稱遵循 pool-編號(hào)-thread-編號(hào) 的格式。線程池的編號(hào)是遞增的,每個(gè)線程有自己的編號(hào)。

7.關(guān)鍵注意事項(xiàng)

  • 守護(hù)線程問(wèn)題:默認(rèn)創(chuàng)建的是非守護(hù)線程,需顯式關(guān)閉
  • 中斷策略一致性:任務(wù)必須實(shí)現(xiàn)正確的中斷處理邏輯
  • 拒絕策略配合:合理配置RejectedExecutionHandler
  • 資源釋放順序:數(shù)據(jù)庫(kù)連接等資源應(yīng)先于線程池關(guān)閉
  • 監(jiān)控機(jī)制:建議集成線程池監(jiān)控(如JMX)

8.高級(jí)應(yīng)用場(chǎng)景

分級(jí)關(guān)閉策略

public class TieredShutdownManager { 
    // 定義三個(gè)優(yōu)先級(jí)的線程池列表:高優(yōu)先級(jí)、中優(yōu)先級(jí)、低優(yōu)先級(jí)
    private final List<ExecutorService> highPriority; 
    private final List<ExecutorService> normalPriority; 
    private final List<ExecutorService> lowPriority; 
  
    // 公共方法用于優(yōu)雅關(guān)閉所有線程池
    public void gracefulShutdown() { 
        // 依次關(guān)閉高、中、低優(yōu)先級(jí)的線程池
        shutdownTier(highPriority, 10, TimeUnit.SECONDS); 
        shutdownTier(normalPriority, 30, TimeUnit.SECONDS); 
        shutdownTier(lowPriority, 60, TimeUnit.SECONDS); 
    } 
  
    // 私有方法,用于優(yōu)雅關(guān)閉指定優(yōu)先級(jí)的線程池
    private void shutdownTier(List<ExecutorService> tier, long timeout, TimeUnit unit) { 
        // 對(duì)指定的線程池列表執(zhí)行關(guān)閉操作
        tier.forEach(ExecutorService::shutdown); 
  
        // 對(duì)每個(gè)線程池執(zhí)行等待終止的操作,指定超時(shí)時(shí)間
        tier.forEach(executor -> { 
            try { 
                // 如果線程池未在超時(shí)時(shí)間內(nèi)終止,則調(diào)用 shutdownNow 強(qiáng)制關(guān)閉
                if (!executor.awaitTermination(timeout, unit)) { 
                    executor.shutdownNow(); 
                } 
            } catch (InterruptedException e) { 
                // 如果在等待終止過(guò)程中線程被中斷,恢復(fù)中斷狀態(tài)并強(qiáng)制關(guān)閉線程池
                Thread.currentThread().interrupt(); 
                executor.shutdownNow(); 
            } 
        }); 
    } 
}

gracefulShutdown 方法按照優(yōu)先級(jí)順序依次關(guān)閉高、中、低優(yōu)先級(jí)的線程池。

shutdownTier 方法首先嘗試正常關(guān)閉每個(gè)線程池(調(diào)用 shutdown),然后通過(guò) awaitTermination 方法等待線程池在指定的時(shí)間內(nèi)結(jié)束,如果未成功結(jié)束,則調(diào)用 shutdownNow 強(qiáng)制關(guān)閉。

在關(guān)閉過(guò)程中,如果發(fā)生中斷,則會(huì)捕獲 InterruptedException 異常,并且中斷當(dāng)前線程,同時(shí)強(qiáng)制關(guān)閉線程池。

9.性能優(yōu)化建議

根據(jù)任務(wù)類型選擇隊(duì)列策略:

  • CPU密集型:有界隊(duì)列(ArrayBlockingQueue)
  • IO密集型:無(wú)界隊(duì)列(LinkedBlockingQueue)

監(jiān)控關(guān)鍵指標(biāo):

ThreadPoolExecutor executor = (ThreadPoolExecutor) service;
System.out.println("活躍線程數(shù): " + executor.getActiveCount());
System.out.println("完成任務(wù)數(shù): " + executor.getCompletedTaskCount());
System.out.println("隊(duì)列大小: " + executor.getQueue().size());

動(dòng)態(tài)調(diào)整參數(shù):

executor.setCorePoolSize(newSize);
executor.setMaximumPoolSize(newMaxSize);

10.總結(jié)建議

根據(jù)Oracle官方文檔建議,在大多數(shù)生產(chǎn)場(chǎng)景中推薦以下關(guān)閉流程:

  • 優(yōu)先調(diào)用shutdown()
  • 設(shè)置合理的awaitTermination超時(shí)
  • 必要時(shí)調(diào)用shutdownNow()
  • 始終處理返回的未完成任務(wù)
  • 記錄完整的關(guān)閉日志

正確選擇關(guān)閉策略需要綜合考量:

  • 任務(wù)重要性等級(jí)
  • 系統(tǒng)資源限制
  • 業(yè)務(wù)連續(xù)性需求
  • 數(shù)據(jù)一致性要求

到此這篇關(guān)于Java如何優(yōu)雅關(guān)閉異步中的ExecutorService的文章就介紹到這了,更多相關(guān)Java關(guān)閉ExecutorService內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaWeb中Servlet的生命周期及線程安全問(wèn)題詳解

    JavaWeb中Servlet的生命周期及線程安全問(wèn)題詳解

    這篇文章主要介紹了JavaWeb中Servlet的生命周期及線程安全問(wèn)題詳解,Servlet?生命周期可被定義為從創(chuàng)建直到毀滅的整個(gè)過(guò)程,Servlet體系結(jié)構(gòu)是建立在Java多線程機(jī)制之上的,它的生命周期是由Web容器負(fù)責(zé)的,需要的朋友可以參考下
    2024-01-01
  • java、spring、springboot中整合Redis的詳細(xì)講解

    java、spring、springboot中整合Redis的詳細(xì)講解

    這篇文章主要介紹了java、spring、springboot中整合Redis的詳細(xì)講解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java利用Spire.Doc for Java實(shí)現(xiàn)在模板的基礎(chǔ)上創(chuàng)建Word文檔

    Java利用Spire.Doc for Java實(shí)現(xiàn)在模板的基礎(chǔ)上創(chuàng)建Word文檔

    在日常開(kāi)發(fā)中,我們經(jīng)常需要根據(jù)特定數(shù)據(jù)動(dòng)態(tài)生成Word文檔,本文將深入探討如何利用強(qiáng)大的Java庫(kù) Spire.Doc for Java,在預(yù)設(shè)Word模板的基礎(chǔ)上,通過(guò)替換占位符或書(shū)簽來(lái)高效創(chuàng)建定制化的Word文檔,感興趣的小伙伴可以了解下
    2025-12-12
  • Spring MVC通過(guò)添加自定義注解格式化數(shù)據(jù)的方法

    Spring MVC通過(guò)添加自定義注解格式化數(shù)據(jù)的方法

    這篇文章主要給大家介紹了關(guān)于Spring MVC通過(guò)添加自定義注解格式化數(shù)據(jù)的方法,文中先對(duì)springmvc 自定義注解 以及自定義注解的解析進(jìn)行了詳細(xì)的介紹,相信會(huì)對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • spring?@Transactional注解中常用參數(shù)詳解

    spring?@Transactional注解中常用參數(shù)詳解

    這篇文章主要介紹了spring?@Transactional注解中常用參數(shù)詳解,事物注解方式:?@Transactional,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • SpringBoot零基礎(chǔ)入門之基本操作與概念

    SpringBoot零基礎(chǔ)入門之基本操作與概念

    這篇文章主要介紹了SpringBoot的概念、創(chuàng)建和運(yùn)行,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Java如何判斷線程是否結(jié)束的三種方法

    Java如何判斷線程是否結(jié)束的三種方法

    本文主要介紹了Java如何判斷線程是否結(jié)束的三種方法,主要介紹了三種方法,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 使用Java反射機(jī)制提高SpringBoot的代碼質(zhì)量和可維護(hù)性

    使用Java反射機(jī)制提高SpringBoot的代碼質(zhì)量和可維護(hù)性

    保持好的代碼質(zhì)量和遵守編碼標(biāo)準(zhǔn)是開(kāi)發(fā)可維護(hù)和健壯軟件的重要方面,在本文中,我們將探討如何使用 Java 反射來(lái)提高 Spring Boot 應(yīng)用程序的代碼質(zhì)量和可維護(hù)性,需要的朋友可以參考下
    2023-10-10
  • Java concurrency集合之ConcurrentSkipListSet_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java concurrency集合之ConcurrentSkipListSet_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了Java concurrency集合之ConcurrentSkipListSet的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java怎么獲取多網(wǎng)卡本地ip

    Java怎么獲取多網(wǎng)卡本地ip

    java獲取本地ip,獲取多網(wǎng)卡本地ip在項(xiàng)目中經(jīng)常會(huì)用到,下面小編把代碼分享到腳本之家平臺(tái),供大家參考
    2016-03-03

最新評(píng)論

大英县| 四川省| 南木林县| 兴宁市| 玉屏| 平度市| 沙洋县| 大荔县| 集安市| 高青县| 敦化市| 嘉祥县| 西平县| 卫辉市| 安义县| 青铜峡市| 苗栗县| 东安县| 西城区| 隆化县| 淳化县| 红安县| 泾川县| 通州市| 秦安县| 涡阳县| 万源市| 四平市| 深圳市| 夏河县| 金湖县| 西华县| 榕江县| 行唐县| 福泉市| 库车县| 宁武县| 临沂市| 天峨县| 浑源县| 南汇区|