Предварительная инициализация пула рабочих потоков для повторного использования объектов подключения (сокетов)
Мне нужно создать пул рабочих в 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(..));
Обновлено с рабочим кодом
Основываясь на полезных комментариях от Грея и Джонтея, я 'у нас работает следующий код ...
SocketTask
public class SocketTask implements Runnable {
private String workDetails;
private static final ThreadLocal threadLocal =
new ThreadLocal(){
@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