我需要在Java中構建一個工作者池,其中每個工作者都有自己的連接套接字;當工作線程運行時,它使用套接字,但保持打開狀態以便稍後重用。我們決定採用這種方法,因爲與臨時創建,連接和銷燬套接字相關的開銷需要太多的開銷,所以我們需要一種方法,通過這種方法,一組工作者通過套接字連接進行預初始化,隨時準備承擔的工作,同時保持插座資源從其它線程(插座不是線程安全的)安全,所以我們需要沿着這些路線的東西...預初始化工作線程池以重用連接對象(套接字)
public class SocketTask implements Runnable {
Socket socket;
public SocketTask(){
//create + connect socket here
}
public void run(){
//use socket here
}
}
在應用程序啓動時,我們要初始化工作人員以及希望的插座連接太...
MyWorkerPool pool = new MyWorkerPool();
for(int i = 0; i < 100; i++)
pool.addWorker(new WorkerThread());
隨着工作由應用程序的要求,我們派任務給工人池立即執行......
pool.queueWork(new SocketTask(..));
更新的工作代碼
基於從灰色和jontejj有益的意見,我有下面的代碼工作...
SocketTask
public class SocketTask implements Runnable {
private String workDetails;
private static final ThreadLocal<Socket> threadLocal =
new ThreadLocal<Socket>(){
@Override
protected Socket initialValue(){
return new Socket();
}
};
public SocketTask(String details){
this.workDetails = details;
}
public void run(){
Socket s = getSocket(); //gets from threadlocal
//send data on socket based on workDetails, etc.
}
public static Socket getSocket(){
return threadLocal.get();
}
}
個
的ExecutorService
ExecutorService threadPool =
Executors.newFixedThreadPool(5, Executors.defaultThreadFactory());
int tasks = 15;
for(int i = 1; i <= tasks; i++){
threadPool.execute(new SocketTask("foobar-" + i));
}
我喜歡這種方法有以下幾個原因...
- 套接字是本地對象(通過ThreadLocal的)提供給正在運行的任務,消除了併發問題。
- 套接字創建一次並保持打開狀態,當新任務排隊時重複使用 ,消除套接字對象創建/銷燬開銷。
謝謝你的工作代碼片段,對我幫助很大!我想知道:當線程池關閉時,如何關閉數據庫連接? – kaufmanu
搜索執行線程的[有序關閉](http://stackoverflow.com/questions/3332832/graceful-shutdown-of-threads-and-executor),希望它有幫助。 – raffian
我查過了,謝謝!我沒有完全幫助我,雖然...我正在尋找一種方法來調用存儲在ThreadLocal中的所有數據庫連接的dbconnection.close()。我真的不知道如何處理這個......我的意思是,一旦線程池被關閉,db連接就不會自動關閉,對吧? – kaufmanu