日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

菜鳥初學Java的備忘錄(九)

瀏覽:26日期:2024-06-25 15:11:12
內容: 菜鳥初學Java的備忘錄(九)我突然發現了利用接口實現多線程和利用類構造線程體的不同了,以前我好像并沒有太多的注意.利用類構造線程體的時候,需要使用這個類來定義線程對象,比如MyThread thread1=New MyThread(),而使用接口創建線程體的時候,只需要用到Thread類就可以了,比如Thread thread1=new Thread(MyThread).這在幾天前所講的多線程的Socket中均有體現.前面不懈的努力使我現在可以繼續原先未完成的工作,正式向連接池版本的Socket進發了.回顧一下我們是如何創建多線程的服務器MultiThreadRemoteFileServer的,這得看看前幾天的內容了.概括起來,就是為每個等待連接的客戶new一個線程使用,來一個分配一個.每當有客戶機申請一個連接時都在一個新 Thread 中創建一個新 ConnectionHandler(注:使用接口構造的線程體).這意味著可能有一打 Thread在整個系統中運行著.顯然,系統的開銷會因為連接客戶的數目的增長而不斷增加.我們不能夠不考慮到開銷增加到一定程度的時候系統會承受不住的可能.因此,得想個辦法限制連接客戶的數量,提高服務器的效率.那么解決的方案是:在服務器端,我們在服務器啟動時創建一定數量的PooledConnectionHandler,我們把進入的連接放入一個連接池中并讓PooledConnectionHandler 打理剩下的事情.客戶端的程序完全不用修改,這樣設計的優點如下:1.限定了允許同時連接的數目。 2.只需要啟動PooledConnectionHandler線程有限次這兩句話的涵義將在其后的程序中得到體現,下面是 PooledRemoteFileServer 類的結構:import java.io.*;import java.net.*;import java.util.*;public class PooledRemoteFileServer { protected int maxConnections;//定義能同時處理的客戶機連接的最大數目 protected int listenPort;//定義要監聽的端口號 protected ServerSocket serverSocket; public PooledRemoteFileServer(int aListenPort, int maxConnections) { listenPort = aListenPort; this.maxConnections = maxConnections; } public static void main(String[] args) { } public void setUpHandlers(){//創建數目為maxConnections的 PooledConnectionHandler } public void acceptConnections(){//在 ServerSocket 上監聽傳入的客戶機連接,和前面的RemoteFileServer,MultiThreadRemoteFileServer中的監聽程序完全一樣 } protected void handleConnection(Socket incomingConnection) { }//連接處理程序}同樣,首先來看main函數public static void main(String[] args) { PooledRemoteFileServer server = new PooledRemoteFileServer(3000, 3); server.setUpHandlers();//同前面所有服務器的main函數不同,我們先要創建一個連接池,這個池里面有三個可用的connectionHandler server.acceptConnections();//一旦就緒,就開始監聽下面我們就來看創建三個connectionHandler的程序如何實現:public void setUpHandlers(){ for (int i = 0; i < maxConnections; i++) { PooledConnectionHandler currentHandler = new PooledConnectionHandler(); new Thread(currentHandler, 'Handler ' + i).start(); }}setUpHandlers() 方法創建maxConnections個PooledConnectionHandler并在新 Thread 中激活它們. PooledConnectionHandler在這里是一個用接口(Runnable)實現的線程體.用實現了Runnable的對象來創建Thread使我們可以在 Thread 調用 start() 并且可以期望在Runnable上調用了 run()。也就是說,我們的 PooledConnectionHandler 將等著處理進入的連接,每個都在它自己的Thread中進行。我們在示例中只創建三個Thread,而且一旦服務器運行,這就不能被改變。acceptConnections()方法這里就略去不寫了,看看連接處理程序handleConnection(Socket incomingConnection)protected void handleConnection(Socket connectionToHandle) { PooledConnectionHandler.processRequest(connectionToHandle);}這里連接處理程序直接調用了PooledConnectionHandler線程類的類方法processRequest對監聽到的連接進行處理,顯然這個processRequest是一個靜態方法.PooledRemoteFileServer類中的方法均涉及到一個重要的線程類,PooledConnectionHandler.下面就看看這樣一個用接口實現的類長什么樣:public class PooledConnectionHandler implements Runnable { protected Socket connection;//代表當前正在處理的Socket protected static List pool = new LinkedList();//名為 pool 的靜態 LinkedList 保存需被處理的連接,也就是用LinkedList來模擬一個連接池 public PooledConnectionHandler() {//構造函數 } public void handleConnection() {//對連接的I/O操作在這里了 } public static void processRequest(Socket requestToHandle) {//處理客戶連接,將他們加入連接池 } public void run() {//等待有連接來,來了,就調handleConnection()處理 }}可以看出,這個類與多線程Socket那一天的ConnectionHandler非常相似,但不同的是,它帶有處理連接池的手段.首先看看要在監聽程序中用到的processRequest()方法public static void processRequest(Socket requestToHandle) { synchronized (pool) { pool.add(pool.size(), requestToHandle); pool.notifyAll(); }}這里的requestToHandle就是要處理的客戶連接socket.可以這樣說,processRequest所做的工作就是把客戶連接加入到連接池當中.但是要確保在對連接池(Pool)進行操作的時候沒有其他的線程干擾,就需要獲取連接池的對象鎖,并使用同步塊,前面所了解有關synchronized的概念在這里就可以派上用場了.那么,既然已經保證了我們是唯一“涉水的人,我們就可以把傳入的 Socket 添加到 LinkedList 的尾端.一旦我們添加了新的連接,我們就可以使用pool.notifyall通知其它正在等待該池的 Thread,連接池的對象鎖解除,現在可用了.從另外一個角度來說,也可以說是通知另外一個正在等待的線程,一些條件已經具備了.那么這個在等待的線程是什么呢?我們來實現PooledConnectionHandler上的run()方法,它將在連接池上等待,并且池中一有連接就處理它,所以是這個要處理連接的線程在等待著呢:public void run() { while (true) { synchronized (pool) { while (pool.isEmpty()) { try { pool.wait(); } catch (InterruptedException e) {return;} } connection = (Socket) pool.remove(0);//攫取池中的第一個連接,使之成為馬上就要處理的connection } handleConnection();//然后交給handleConnection處理 }}這個函數告訴了我們每個PooledConnectionHandler線程主要都在run些什么.顯然,它是要不停的去看連接池中有沒有接入的連接,如果有,馬上處理,因此它在等待'連接池有連接了'這樣一個條件.那么誰來告訴它這個條件滿足了呢,顯然是剛才的processRequest.當processRequest發出通知(pool.notify())的時候,這個條件就滿足了,這時run()中的處理程序就不用再繼續等待了,就可以馬上去出一個連接進行處理.反過來說,在這個條件沒有滿足之前,wait()所在的線程還是要處于阻塞狀態,或者是說停滯狀態.由于同樣要對pool進行操作,所以這里也需要使用到同步塊.讓我們再次復習一下對象鎖的概念.當 run() 擁有池的互斥鎖時,processRequest() 如何能夠把連接放到池中呢?答案是對池上的 wait() 的調用釋放鎖,而 wait() 接著就在自己返回之前再次攫取該鎖。這就使得池對象的其它同步代碼可以獲取該鎖。 最后,我們看看PooledConnectionHandler線程中的handleConnection()方法.跟在多線程服務器中不同,我們的PooledConnectionHandler有一個 handleConnection() 方法。這個方法的代碼跟非池式的,也就是多線程服務器中的ConnectionHandler上的 run() 方法的代碼完全一樣。首先,我們把 OutputStream 和 InputStream 分別包裝進(用 Socket 上的 getOutputStream() 和 getInputStream())BufferedReader 和 PrintWriter。然后我們逐行讀目標文件,就象我們在多線程示例中做的那樣。再一次,我們獲取一些字節之后就把它們放到本地的 line 變量中,然后寫出到客戶機。完成讀寫操作之后,我們關閉 FileReader 和打開的流。講到這里,我們可以看到,程序中有兩個類,PooledRemoteFileServer和PooledConnectionHandler.PooledRemoteFileServer并不直接處理連接請求,它只是負責監聽這些連接,并把他們仍到連接池里面,至于處理的具體環節,都交給PooledConnectionHandler負責了。我們的帶有連接池的服務器研究完了。讓我們回顧一下創建和使用“池版服務器的步驟:1.創建一個新種類的連接處理程序(我們稱之為 PooledConnectionHandler)來處理池中的連接。2.修改服務器以創建和使用一組 PooledConnectionHandler。 附:PooledRemoteFileServer.java的源碼import java.io.*;import java.net.*;import java.util.*;public class PooledRemoteFileServer { protected int maxConnections; protected int listenPort; protected ServerSocket serverSocket; public PooledRemoteFileServer(int aListenPort, int maxConnections) { listenPort = aListenPort; this.maxConnections = maxConnections; } public void acceptConnections() { try { ServerSocket server = new ServerSocket(listenPort, 5); Socket incomingConnection = null; while (true) { incomingConnection = server.accept(); handleConnection(incomingConnection); } } catch (BindException e) { System.out.println('Unable to bind to port ' + listenPort); } catch (IOException e) { System.out.println('Unable to instantiate a ServerSocket on port: ' + listenPort); } } protected void handleConnection(Socket connectionToHandle) { PooledConnectionHandler.processRequest(connectionToHandle); } public static void main(String[] args) { PooledRemoteFileServer server = new PooledRemoteFileServer(3000, 3); server.setUpHandlers(); server.acceptConnections(); } public void setUpHandlers() { for (int i = 0; i < maxConnections; i++) { PooledConnectionHandler currentHandler = new PooledConnectionHandler(); new Thread(currentHandler, 'Handler ' + i).start(); } }}class PooledConnectionHandler implements Runnable { protected Socket connection; protected static List pool = new LinkedList(); public PooledConnectionHandler() { } public void handleConnection() { try { PrintWriter streamWriter = new PrintWriter(connection.getOutputStream()); BufferedReader streamReader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String fileToRead = streamReader.readLine(); BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead)); String line = null; while ((line = fileReader.readLine()) != null) streamWriter.println(line); fileReader.close(); streamWriter.close(); streamReader.close(); } catch (FileNotFoundException e) { System.out.println('Could not find requested file on the server.'); } catch (IOException e) { System.out.println('Error handling a client: ' + e); } } public static void processRequest(Socket requestToHandle) { synchronized (pool) { pool.add(pool.size(), requestToHandle); pool.notifyAll(); } } public void run() { while (true) { synchronized (pool) { while (pool.isEmpty()) { try { pool.wait(); } catch (InterruptedException e) { return; } } connection = (Socket) pool.remove(0); } handleConnection(); } }} Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
美女尤物国产一区| 亚洲精品a级片| 中文av在线全新| 一区二区三区四区日本视频| 麻豆视频在线观看免费网站黄| 国产精品久久久久蜜臀| 国产精品mm| 一区二区日韩免费看| 久久国产精品亚洲77777| 首页国产精品| 91国内精品| 日韩精品视频一区二区三区| 亚洲欧美日本国产| 亚洲aⅴ网站| 一区二区不卡| 久久精品色播| 亚洲三级在线| 麻豆一区二区99久久久久| av中文资源在线资源免费观看| 在线观看精品| 午夜亚洲福利在线老司机| 欧美私人啪啪vps| 国产精品婷婷| 日韩av资源网| 韩国女主播一区二区三区| 狠狠久久伊人| 欧美精品一区二区久久| 婷婷综合一区| 国产一区二区三区不卡av | 国产欧美高清| 日本黄色精品| 免费中文字幕日韩欧美| 在线国产精品一区| 国产精品一站二站| 日韩免费看片| 亚洲精品一二| 美女av在线免费看| 亚洲人妖在线| 精品网站999| 精品日韩毛片| 国产精品视频一区视频二区| 久久精品在线| 国产精品一站二站| 日韩1区在线| 日韩在线成人| 好吊一区二区三区| 国产一区调教| 欧美精品观看| 中文无码日韩欧| 欧美中文字幕一区二区| 国产一区二区三区视频在线| 日韩av中文在线观看| 国产手机视频一区二区| 国产精品久久久久久久免费观看| 日韩精品一区二区三区免费视频| 亚洲国产一区二区三区在线播放| 极品av在线| 久久免费影院| 国产亚洲人成a在线v网站| 丝袜诱惑制服诱惑色一区在线观看 | 亚洲a一区二区三区| 久久精品资源| 日本a口亚洲| 在线国产日韩| 亚洲一区二区三区四区五区午夜| 98精品视频| 高清一区二区| 国产精品久久国产愉拍| 欧美天堂一区二区| 日韩国产欧美在线播放| 中文字幕亚洲精品乱码| 香蕉成人久久| 亚洲综合日韩| 国产一级久久| 亚洲在线观看| 中文亚洲免费| 99国产精品99久久久久久粉嫩| 91精品xxx在线观看| 国产自产自拍视频在线观看| 国内一区二区三区| 麻豆一区二区在线| 久久尤物视频| 久久亚洲人体| 卡一卡二国产精品| 精品一区二区三区中文字幕在线| 久久成人高清| 精品亚洲a∨| 国产aa精品| 蜜臀国产一区| 久久黄色影院| 1000部精品久久久久久久久| 激情久久婷婷| 久久精品国产亚洲夜色av网站| 日韩精品一区二区三区免费观看| 麻豆精品蜜桃| 亚洲韩日在线| 亚洲一区欧美二区| 日本欧美在线看| 日本不卡高清| 国产极品模特精品一二| 久久三级毛片| 天堂中文av在线资源库| 久久九九国产| 日韩一区二区免费看| 快she精品国产999| 91成人精品观看| 免费亚洲婷婷| 国产精品13p| 久久高清免费| 国产一区导航| 亚洲开心激情| 国产福利亚洲| 国产精品亚洲一区二区三区在线观看| 色天使综合视频| 91久久在线| 亚洲aa在线| 国产精品chinese| 国产一区二区视频在线看| 日产精品一区| 国产亚洲一级| 日韩精品欧美成人高清一区二区| 国产精品美女午夜爽爽| 久久亚州av| 久久精品青草| 一区二区国产在线| 久久99精品久久久久久园产越南| 欧洲精品一区二区三区| 亚洲免费婷婷| 欧美经典一区| 在线国产一区| 国产伦乱精品| 欧美日韩在线二区| 日本在线一区二区三区| 精品视频自拍| 偷拍欧美精品| 欧美日韩 国产精品| 午夜av不卡| 亚洲精品人人| 黄色网一区二区| 欧美另类综合| 国产精久久一区二区| 亚洲午夜av| 欧美日本三区| 蜜桃精品在线| 亚洲精品成人一区| 国产v日韩v欧美v| 蜜臀精品一区二区三区在线观看| 欧美激情aⅴ一区二区三区 | 99国产精品| 国产精品a久久久久| 精品一区在线| 久久精品99久久久| 久久国产中文字幕| 青草综合视频| 国产精品最新自拍| 亚洲精品自拍| 精品福利久久久| 亚洲精品123区| 国产色噜噜噜91在线精品| 毛片在线网站| 亚洲有吗中文字幕| 国产成年精品| 美女久久网站| 另类综合日韩欧美亚洲| 欧洲av一区二区| 免费观看日韩电影| 国产探花一区在线观看| 日韩精品不卡一区二区| 亚洲丝袜美腿一区| 久久精品福利| 99pao成人国产永久免费视频| 亚洲精品中文字幕99999| 久久精品一区二区三区中文字幕| 亚洲第一区色| 18国产精品| 久久婷婷一区| 日韩激情一二三区| 午夜av成人| 久久国产精品免费一区二区三区| 日韩av福利| 日本成人在线一区| av高清不卡| 日韩精品一二三| 国产传媒在线| 日本91福利区| 国产中文一区| 国产精品宾馆| 欧美日韩国产欧| 精品一区二区三区中文字幕视频| 亚洲欧美久久久| 国产一区二区三区探花| 亚洲最新av| 亚洲黑丝一区二区| 久久久精品国产**网站| 日本aⅴ免费视频一区二区三区| 国产视频欧美| 麻豆精品蜜桃| zzzwww在线看片免费| 免费在线亚洲欧美| 国产剧情一区|