Предварительная инициализация пула рабочих потоков для повторного использования объектов подключения (сокетов)

Мне нужно создать пул рабочих в 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 

Ответы на вопрос(2)

Ваш ответ на вопрос