Привет, я создаю сеть Peer2Peer, используя сокет UDP, каждый раз, когда сервер получает сообщение от клиента, он создает поток для обработки запроса.am, пытающегося реализовать очередь ThreadPool для хранения запроса и ограничения количество потоков, выполняемых на машине, и всякий раз, когда поток свободен, мы получаем потоки из очереди (Producer/Consumer), я пробовал какое-то время, но новые потоки не добавляются в очередь, заканчивающуюся только в конце добавлен первый поток. Многопоточный UDP-сервер с использованием ThreadPool
public void run() {
BlockingQueue<Runnable> queue=new LinkedBlockingQueue<Runnable>(10);
ExecutorService tpes =Executors.newFixedThreadPool(10);
int server_port = 8767;
DatagramSocket s = null;
while(true){
byte[] message = new byte[1024];
DatagramPacket p = new DatagramPacket(message, message.length);
try{
s = new DatagramSocket(server_port);
}catch (SocketException e) {
e.printStackTrace();
System.out.println("Socket excep");
}
try {
s.receive(p);
queue.put(new RequestHandler(p));
tpes.execute(queue.take());
}catch (Exception e) {
e.printStackTrace();
System.out.println("IO EXcept");
}
finally{
s.close();
}
}
}
Я не знаю, где пойдет не так? любая помощь была бы оценена
Этот метод запуска один из 'RequestHandler'? Вы создаете странную рекурсию. Также, если вы '.take()' объект, который вы только что положили там несколько строк ранее, вы могли бы просто использовать его напрямую. – zapl
метод run не принадлежит RequestHandler, он является частью peerNode, который может действовать как сервер в прогоне, я слушаю запрос, и я создаю поток, а класс RequestHandler заботится обо всем остальном. Я не хочу использовать объект напрямую, потому что я буду создавать много потоков (1 поток на запрос). Я хочу использовать очередь и хранить потоки и использовать фиксированное количество потоков. – Mero