基於執行緒池的http伺服器

2021-07-15 13:07:18 字數 1664 閱讀 5278

public static void main(string args) 

}catch(ioexception e)

}

這是整個程式的入口,初始化該初始化的,監聽該

監聽的。threadpoolmanager用於管理執行緒,初始化有三個執行緒。

accept方法會造成阻塞,知道有訊息傳過來。將接收到的訊息傳入到manager中以便於管理。

public class threadpoolmanager 

public int getmaxthread()

public threadpoolmanager(int threadcount)

}public void add(socket client)

}

執行緒池類,執行緒池在初始化之後放入乙個vector之中,同時將請求放入乙個緩衝區中,緩衝區用 arrayblockingqueue來做。

blockingqueue介面定義了一種阻塞的fifo queue,每乙個blockingqueue都有乙個容量,讓容量滿時往blockingqueue中新增資料時會造成阻塞,當容量為空時取元素操作會阻塞。arrayblockingqueue是對blockingqueue的乙個陣列實現,它使用一把全域性的鎖並行對queue的讀寫操作,同時使用兩個condition阻塞容量為空時的取操作和容量滿時的寫操作。

public synchronized void run()

this.client = buffer.poll();

system.out.println(this.number+"------running");

}printstream outstream;

bufferedreader in ;

try else

system.out.println("不存在");

}in.close();

} catch (ioexception e)

sleep(3*1000);

"thread is sleeping");

}}catch(interruptedexception e)

}

不斷監視緩衝區中的動向,如果有了資料,就從緩衝區中取出socket,否則進入等待列,將socket封裝到bufferreader中,取出請求的報文頭,如果請求的檔案存在,就將檔案放入printstream中,送入客戶端。為了看出效果,讓執行緒工作完之後睡3秒鐘。

private string getfilename(string s)catch(stringindexoutofbound***ception e)

if(f.equals("")) f = "index.html";

return f;

}

通過擷取報文頭,來獲取請求檔案的位置。

private void sendfile(printstream ps,file file)catch(exception e)

}

將流傳輸到客戶端的過程,先將資料寫入到乙個位元組流中,輸入到客戶端。

這樣,乙個簡單的http伺服器就完成了,伺服器還有乙個問題,就是請求過來之後會阻塞。從高人處得知,可以用nio這種非阻塞的io進行優化。正在研究之中。

自己動手寫http伺服器 執行緒池(一)

建立乙個執行緒池,每有乙個連線物件就將它新增到工作佇列中,執行緒池中的執行緒通過競爭來取得任務並執行它 它是通過訊號量實現的 filename threadpool.h ifndef threadpool h define threadpool h include include include i...

執行緒池併發伺服器

預先建立阻塞於accept多執行緒,使用互斥鎖上鎖保護accept 預先建立多執行緒,由主線程呼叫accept pthread mutex t lock 用於鎖住本結構體 pthread mutex t thread counter 記錄忙狀態執行緒個數de瑣 busy thr num pthrea...

自己寫Http伺服器(四)新增執行緒池

在我們伺服器之前的那部分,我們通過建立執行緒讓執行緒去處理任務,從而可以在同一時間可以處理多個請求,但是這樣則需要我們頻繁的建立 銷毀執行緒,這樣在一定程度上會產生資源的損耗,影響我們伺服器的效率,其次如果短時間內的大量請求,導致伺服器建立執行緒數量過多,可能導致記憶體達到極限,影響作業系統中其他重...