亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        線程池技術(shù)在考試系統(tǒng)中的應(yīng)用①

        2016-06-15 03:50:45葛萌于博歐陽宏基咸陽師范學院信息工程學院咸陽7000河南建筑職業(yè)技術(shù)學院信息工程系鄭州450064
        計算機系統(tǒng)應(yīng)用 2016年4期

        葛萌,于博,歐陽宏基(咸陽師范學院 信息工程學院,咸陽 7000)(河南建筑職業(yè)技術(shù)學院 信息工程系,鄭州 450064)

        ?

        線程池技術(shù)在考試系統(tǒng)中的應(yīng)用①

        葛萌1,于博2,歐陽宏基1
        (咸陽師范學院 信息工程學院,咸陽 712000)
        (河南建筑職業(yè)技術(shù)學院 信息工程系,鄭州 450064)

        摘 要:當較大規(guī)??蛻舳瞬l(fā)請求服務(wù)器端應(yīng)用程序時,傳統(tǒng)的為每個請求創(chuàng)建線程的解決方法會導致服務(wù)器端性能的嚴重下降甚至死機.通過分析JDK的Executor框架,從工作原理、核心線程池對象、執(zhí)行策略等方面詳細描述了線程池模型,應(yīng)用到一個三層C/S架構(gòu)的在線考試系統(tǒng)中,給出了服務(wù)端的設(shè)計架構(gòu)和實現(xiàn)代碼.通過仿真測試證明了線程池技術(shù)在解決較大并發(fā)訪問方面的穩(wěn)定性.

        關(guān)鍵詞:線程池; Executor框架; 在線考試系統(tǒng)

        目前已經(jīng)有一些成功應(yīng)用的考試系統(tǒng),例如全國計算機等級考試、軟件資格(水平)考試系統(tǒng)等.這類系統(tǒng)是基于C/S架構(gòu)的網(wǎng)絡(luò)通信系統(tǒng),學生使用客戶端程序在一個較小規(guī)模(全國計算機等級考試要求每個考場的最大考生數(shù)為99人)的局域網(wǎng)內(nèi)與唯一的服務(wù)器端程序通信.當考生的并發(fā)量較小時,服務(wù)器可采用為每個請求創(chuàng)建一個線程的方式來與考生端通信,實現(xiàn)難度也不大.但是當考生端有較大規(guī)模并發(fā)量時,此方式將會極大的消耗服務(wù)器資源,因為大量線程間頻繁的切換會打亂系統(tǒng)固有的切換周期,而且每個線程本身都會占用一定的內(nèi)存,因此會導致服務(wù)器端響應(yīng)緩慢甚至死機的情況.

        為了解決上述問題,從硬件方面可以采取提高服務(wù)器內(nèi)存、CPU個數(shù)以及搭建服務(wù)器集群的方式來完成.本文主要從軟件設(shè)計方面通過引入線程池技術(shù)來解決.分析了JDK的線程池模型、介紹了一個在線考試系統(tǒng)框架及主要功能,并將線程池引入到服務(wù)器端的程序設(shè)計中,詳細描述了實現(xiàn)過程.通過與傳統(tǒng)線程-模型在高并發(fā)量的測試對比,證明了線程池的可行性.

        1 線程池技術(shù)

        1.1工作原理

        線程池的核心思想是避免創(chuàng)建大量線程和對已有線程的復(fù)用[2,3].通常情況下,服務(wù)器端程序在啟動時創(chuàng)建若干數(shù)量的線程對象并緩存起來,此時它們處于空閑狀態(tài); 當客戶端請求到來并被服務(wù)器接受后(否則將客戶端請求放入任務(wù)隊列),從線程池中喚醒一個線程與該客戶端進行通信,結(jié)束通信后該線程對象會被線程池回收,準備用它執(zhí)行下一次任務(wù).線程池還要對任務(wù)隊列的大小、空閑線程的銷毀、新線程的創(chuàng)建以及對客戶端請求的拒絕等進行管理,這樣可以更好的利用線程對象并對服務(wù)器進行有效的保護.

        與傳統(tǒng)多線程方式相比,線程池具有以下兩點優(yōu)勢[4]: ①減少了創(chuàng)建和銷毀線程的次數(shù),每個工作線程都可以被重用,能執(zhí)行多個任務(wù).②可根據(jù)系統(tǒng)的承載能力方便地調(diào)整線程池中線程的數(shù)目,防止消耗過量系統(tǒng)資源而導致崩潰.

        1.2JDK線程池體系結(jié)構(gòu)

        由于線程池與業(yè)務(wù)是無關(guān)的,設(shè)計一個線程池至少要考慮以下幾個方面[5,6]: ①對任務(wù)進行描述的類,包含線程池中線程執(zhí)行的所有信息.②可動態(tài)變化的、保存任務(wù)的隊列.③線程池管理器,用來創(chuàng)建、銷毀線程池,提供對任務(wù)的調(diào)用與轉(zhuǎn)發(fā).④處理任務(wù)的工作線程類.⑤查詢線程,用來檢測任務(wù)的完成情況.⑥服務(wù)器無法接受請求時的拒絕策略.同時還要考慮同步以及死鎖風險等,所以從頭開發(fā)一個線程池是具有一定難度的.為了簡化使用線程池的難度,JDK從1.5版本開始在java.util.concurrent包中提供了對線程池功能的支持,相關(guān)核心接口、類的層次關(guān)系如圖1所示.

        圖1 JDK線程池的類圖關(guān)系

        Executor接口包含唯一的execute方法,通過Runnable來表示要執(zhí)行的任務(wù),將任務(wù)的提交與執(zhí)行操作進行解耦.ExecutorService接口是真正意義上的線程池頂級接口,其中定義了提交FutureTask任務(wù)的方法以及若干與線程池生命周期相關(guān)的方法.例如: shutdown()方法用來關(guān)閉線程池,以前提交的任務(wù)會被執(zhí)行.shutdownNow()方法強制關(guān)閉線程池,取消所有運行中的任務(wù)以及在工作隊列中等待的任務(wù),同時將等待任務(wù)以List集合返回.awaitTermination方法使得當前線程在給定的時間單位內(nèi)等待給定的時間間隔,若超時則返回線程池是否已經(jīng)關(guān)閉.isTerminated()方法判斷線程池是否已經(jīng)處于關(guān)閉狀態(tài).抽象類AbstractExecutorService主要實現(xiàn)了ExecutorService FutureTask相關(guān)的一些任務(wù)創(chuàng)建和提交的方法.ThreadPoolExecutor是最核心的一個類,用來表示線程池對象(詳見1.3節(jié)描述).Scheduled ThreadPool Executor具有ThreadPoolExecutor的大部分功能,可另行安排在給定的延遲后或者定期執(zhí)行任務(wù).

        1.3核心線程池對象

        ThreadPoolExecutor是線程池體系中的核心類,用來創(chuàng)建和維護線程池對象.該類包含的主要屬性說明如下[7]:

        corePoolSize: 在沒有任務(wù)執(zhí)行時,線程池中所保留的線程數(shù)目.

        maximumPoolsize: 線程池中同時工作的線程數(shù)的最大值.

        keepAliveTime: 當線程數(shù)大于核心數(shù)時,空閑線程等待新任務(wù)的最長時間.超過這個時間空閑線程沒有接到任務(wù)就會被回收.

        unit: keepAliveTime參數(shù)的時間單位.workers:正在被線程執(zhí)行的任務(wù)集合.workQueue: 等待被執(zhí)行的任務(wù)隊列,任務(wù)實現(xiàn)Runnable接口,由Execute方法調(diào)用執(zhí)行.

        threadFactory: 線程工廠,用于在線程池需要新創(chuàng)建線程的時候創(chuàng)建線程.

        defaultHandler: 當前池中線程數(shù)已達到最大值,并且任務(wù)隊列已滿,線程池中無法承載線程時的處理策略.

        線程池的核心大小(corePoolSize)、最大值(MaximumPoolSize)和存活大小(keepAliveTime)共同負責線程的創(chuàng)建和銷毀.如果當前線程池處于運行狀態(tài),任務(wù)提交給線程池后的執(zhí)行過程如圖2所示.通過調(diào)節(jié)線程池的基本大小和存活時間,可以幫助線程池回收空閑線程占有的資源,從而使這些資源可以用于執(zhí)行其它工作.

        圖2 線程池中任務(wù)的執(zhí)行流程

        1.4執(zhí)行策略

        執(zhí)行策略是一種資源管理方式,通過限制并發(fā)的數(shù)量來確保應(yīng)用程序不會由于資源耗盡而崩潰.執(zhí)行策略[8]主要從執(zhí)行任務(wù)的線程、任務(wù)的執(zhí)行順序、任務(wù)并發(fā)執(zhí)行的個數(shù)、任務(wù)隊列中等待執(zhí)行的個數(shù)、對哪個任務(wù)進行拒絕并如何通知應(yīng)用程序等方面來定義任務(wù)的執(zhí)行,從而確保應(yīng)用程序具有較好的性能.

        Executors類通過工廠方法提供了四種執(zhí)行策略來管理工作線程,分別是: ①newSingleThreadPool: 確保所有任務(wù)按照提交的先后順序(FIFO、LIFO、優(yōu)先級)由唯一工作線程來執(zhí)行,該策略不算真正意義上的并發(fā).②newFixedThreadPool(Fix類型): 隨著任務(wù)的提交而逐個創(chuàng)建線程,直到數(shù)量達到某個固定的最大值.③newCachedThreadPool(Cached類型): 線程池大小完全依賴于操作系統(tǒng)(或者JVM)能夠創(chuàng)建的最大線程數(shù),并且能根據(jù)當前任務(wù)的數(shù)量來調(diào)整線程池中線程的個數(shù),適合于執(zhí)行生存周期較短的異步任務(wù).④newScheduledThreadPool: 創(chuàng)建一個大小無限的線程池.此線程池支持定時以及周期性執(zhí)行任務(wù)的需求.以上策略中,如果有線程因為異常而終止都會創(chuàng)建新的線程對象來彌補.如果上述4種策略都無法滿足需求,可以通過創(chuàng)建ThreadPoolExecutor對象來定制策略.

        2 線程池在系統(tǒng)中的應(yīng)用

        2.1考試系統(tǒng)架構(gòu)

        在線考試系統(tǒng)是基于校園網(wǎng)的分布式三層C/S架構(gòu)(如圖3所示)[9],分別為: 表示層、業(yè)務(wù)層和數(shù)據(jù)層.表示層是應(yīng)用的用戶接口部分,采用Java Swing來設(shè)計,界面和功能通過角色來區(qū)分.業(yè)務(wù)層是系統(tǒng)的核心內(nèi)容,由位于服務(wù)器端的業(yè)務(wù)邏輯來封裝,通過RMI向表示層提供服務(wù).數(shù)據(jù)層就是數(shù)據(jù)庫管理系統(tǒng),為業(yè)務(wù)層和表示層提供數(shù)據(jù)服務(wù),服務(wù)器端和客戶端均采用MySQL數(shù)據(jù)庫.

        圖3 考試系統(tǒng)架構(gòu)圖

        三層分布式處理方式使得學生端和服務(wù)器端各自運行本地和遠程服務(wù),可以解決數(shù)據(jù)層與業(yè)務(wù)層的分離,達到數(shù)據(jù)的安全保密.由于考生端程序運行于本地,只有在登錄、抽取試題與提交試卷時才與服務(wù)器通信,答題階段都是訪問本地的數(shù)據(jù)庫,這樣可以提高數(shù)據(jù)讀取效率、減輕對服務(wù)端的壓力.

        2.2基于線程池的服務(wù)器端設(shè)計

        由于考生只有在登錄、抽取試題和提交試卷這三個操作涉及與服務(wù)器端交互,考慮到考生人數(shù)的眾多以及操作的同時性,所以服務(wù)器端采用線程池技術(shù).所設(shè)計的服務(wù)器端的工作流程是: 1)初始化系統(tǒng)信息,讀取參加本次考試的學生總數(shù),該數(shù)值用于創(chuàng)建線程池的任務(wù)隊列.2)創(chuàng)建線程池對象以及管理線程.3)創(chuàng)建基于TCP協(xié)議的ServerSocket套接字,在某一端口監(jiān)聽考生端的請求.4)當有考生端請求到來時,將請求加到任務(wù)隊列,從線程池中拿出空閑線程去接受請求.5)管理線程用于監(jiān)測線程池中線程的數(shù)量及時進行新線程的創(chuàng)建與銷毀.6)任務(wù)處理線程對考生端發(fā)送過來的信息進行分析,根據(jù)登錄、抽題和交卷操作分別進行處理.

        2.3服務(wù)器端的實現(xiàn)

        圖4 服務(wù)器端流程圖

        當服務(wù)器端啟動考試后,創(chuàng)建基于TCP協(xié)議的ServerSocket對象.如果服務(wù)器成功接受考生端的請求便返回一個Socket對象(該Socket對象與某個考生端是一一對應(yīng)的).通過實現(xiàn)Runnable接口按匿名內(nèi)部類方式創(chuàng)建任務(wù)對象,并提交給線程池對象的execute()方法進行調(diào)用.相關(guān)核心代碼如下所示:

        handleRequest為任務(wù)對象的核心方法,通過封裝Socket對象,根據(jù)讀取輸入流中第一行字符串信息判斷當前客戶端的請求類型并執(zhí)行相應(yīng)的邏輯.

        3 仿真測試

        服務(wù)器可用內(nèi)存4G,操作系統(tǒng)為Windows Server 2008,CPU個數(shù)是4,JDK版本為1.6.服務(wù)器端分別運行多線程、Fixed類型線程池和Cache類型線程池模型的程序; 客戶機通過測試程序來模擬一定數(shù)量的學生端向服務(wù)器發(fā)起抽取試題請求,試題文件的容量大約在160KB左右,統(tǒng)計三種情況下學生端讀取試題的平均時間.為了能夠使服務(wù)器接受更多的客戶端連接請求,采用ServerSocket(int port,int backlog)構(gòu)造方法來創(chuàng)建服務(wù)器端套接字,其中backlog表示允許接受客戶端請求的最大連接數(shù),測試過程過不斷改變此值,并將該值與客戶端并發(fā)數(shù)保持一致.對于Fixed類型線程池,根據(jù)文獻[10]的研究最大線程數(shù)=CPU數(shù)量*2+2,以達到對CPU的最佳利用率.測試結(jié)果如表1所示.

        表1 仿真測試

        從表1 看出,隨著并發(fā)數(shù)量的增加,在多線程方式下學生端抽到試題的平均時間逐漸增大,過多的線程導致服務(wù)器的開銷增大; 線程池方式下,兩種類型的線程池在同數(shù)量的請求下,學生端抽到試題的平均時間都比多線程方式小,這是因為線程池實現(xiàn)了線程的重用,減少了線程創(chuàng)建、銷毀的時間消耗.Fix類型的線程池采用LinkedBlockingQueue作為存放任務(wù)的隊列,keepAliveTime值為0秒; Cached類型的線程池采用SynchronousQueue作為存放任務(wù)的隊列,keepAliveTime值為60秒,所以在同等并發(fā)量情況下,Fix類型的線程池比Cache類型的線程池具有較高的效率.測試結(jié)果表明采用線程池技術(shù)的本系統(tǒng)是可行的、高效的.

        4 結(jié)語

        與傳統(tǒng)的為每個請求創(chuàng)建一個線程的方式相比,Executor 線程池執(zhí)行框架實現(xiàn)了任務(wù)描述、提交與任務(wù)執(zhí)行之間的解耦; 簡化了對任務(wù)和線程的管理,提高了系統(tǒng)效率.下一步準備將本考試系統(tǒng)應(yīng)用于更多科目的考試,科目不同會導致試題的容量不同,進而研究文件容量、網(wǎng)絡(luò)傳輸速度、硬件參數(shù)與線程池的并發(fā)關(guān)系,進一步優(yōu)化系統(tǒng)的性能.

        參考文獻

        1杜靜,何利娟,歐陽宏基.基于JDBC與DAO模式的在線考試系統(tǒng)設(shè)計與實現(xiàn).咸陽師范學院學報,2014,29(2):26–29.

        2宋開衛(wèi),石堅,程哲.基于線程池的數(shù)據(jù)采集器在網(wǎng)管中的應(yīng)用.計算機技術(shù)與發(fā)展,2007,17(7):210–212.

        3王華,馬亮,顧明.線程池技術(shù)研究與應(yīng)用.計算機應(yīng)用研究,2005,22(11):141–142.

        4劉新強,曾兵義.用線程池解決服務(wù)器并發(fā)請求的方案設(shè)計.現(xiàn)代電子技術(shù),2011,34(15):141–143.

        5閆保中,張波.線程池技術(shù)在車流監(jiān)控系統(tǒng)中的應(yīng)用.應(yīng)用科技,2011,38(10):18–22.

        6王文武,趙衛(wèi)東,王志成,陳悅,韓下林.高性能服務(wù)器底層網(wǎng)絡(luò)通信模塊的設(shè)計方法.計算機工程,2009,35(3):103–105.

        7吳玉,劉美伶,祝建中.基于Java Executor的并發(fā)技術(shù)研究.計算機時代,2009,(2):8–10.

        8Goetz B,Peierls T,Bloch J.Java concurrency in practice.China Machine Press,2014: 98–102.

        9田屏.基于C/S架構(gòu)的考試系統(tǒng)設(shè)計[碩士學位論文].貴陽:貴州大學,2008.

        10顧永新.運用線程池技術(shù)實現(xiàn)數(shù)據(jù)庫數(shù)據(jù)高速同步.信息系統(tǒng)工程,2013,(3):97–99,126.

        Application of Thread Pool Technology in Examination System

        GE Meng1,YU Bo2,OUYANG Hong-Ji1
        1(Information Engineering College,Xianyang Normal University,Xianyang 721000,China)
        2(Information Engineering Department,Henan Technical College Of Construction,Zhenzhou 450064,China)

        Abstract:When large-scale client requests for applications in server concurrently,traditional solutions create a thread for every request,which will lead to a serious decline in server performance and even crash.By analyzing the JDK’s Executor framework,the paper described in detail thread pool model from the principle of work,core thread pool object,implementation strategy and other aspects,applied the thread pool to a online examination system of three-layer C/S architecture,and gave the server’s design framework and implementation code.Through simulation tests,the stability of the thread pool technical in the process of solving large concurrent access is proved.

        Key words:thread pool; Executor framework; online examination system考試系統(tǒng)是高等院校數(shù)字化校園建設(shè)的一個重要內(nèi)容,通過代替?zhèn)鹘y(tǒng)的紙質(zhì)考試以減少校園開支、提高成績的客觀性和公正性,并且減輕教師的工作強度[1].

        基金項目:①咸陽師范學院專項科研計劃(2012XSYK070)

        收稿時間:2015-07-29;收到修改稿時間:2015-10-08

        日本岛国视频在线观看一区二区 | 免费毛片在线视频| 久久精品视频按摩| 亚洲一区久久蜜臀av| 在线播放av不卡国产日韩| 2019日韩中文字幕mv| 天堂8中文在线最新版在线| 国产国拍亚洲精品永久不卡| 国产激情视频免费观看| 精品人妻av一区二区三区四区| 女人被狂躁的高潮免费视频| 中字幕人妻一区二区三区| 国产一在线精品一区在线观看 | 99久久久人妻熟妇精品一区二区| 国产成人综合日韩精品无码| 无遮无挡爽爽免费毛片| 亚洲AV永久天堂在线观看| 色婷婷久久99综合精品jk白丝 | 巨爆中文字幕巨爆区爆乳| 色www视频永久免费| 欧美性猛交xxxx乱大交蜜桃| 国产亚洲一区二区三区夜夜骚| 国产精品久久av色婷婷网站| 国产午夜片无码区在线播放 | 久久天天躁狠狠躁夜夜96流白浆| 欧美人与动牲交片免费播放| 美腿丝袜视频在线观看| 人妻少妇看a偷人无码| 亚洲色无码国产精品网站可下载| 亚洲女同精品一区二区久久| 午夜精品一区二区三区视频免费看| 就爱射视频在线视频在线| 国产欧美日韩一区二区三区| 国产白嫩美女在线观看| 亚洲成人av一区二区麻豆蜜桃| av网站国产主播在线| 艳妇臀荡乳欲伦69调教视频| 国产精品亚洲综合色区韩国| 亚洲无码毛片免费视频在线观看| 国产性色av一区二区| 亚洲熟妇av一区|