3

Согласно this explanation given in Javadocs, он говорит следующее оРабота очереди в newFixedThreadPool()?

общественного статического ExecutorService newFixedThreadPool (INT nThreads)

Создает пул потоков, который повторно использует фиксированное количество потоков, работающие выкл общая неограниченную очередь. В любой момент, в большинстве случаев nThreads будут активными задачами обработки. Если дополнительные задачи отправляются , когда все потоки активны, они будут ждать в очереди до тех пор, пока не появится поток . Если какой-либо поток завершается из-за сбоя во время выполнения до выключения, новый новый будет заменен на место для выполнения последующих задач. Потоки в пуле будут существовать до , он явно отключается.

В какой очереди они говорят? Что делать, если я не использую любой очереди в моем многопоточном приложении, как ниже:

ExecutorService service; 
service=Executors.newFixedThreadPool(5); 
while(true){ 
try { 
    s=ss.accept(); 
//new Thread(new MultithreadedInvocation(s)).start();  
    service.submit(new MultithreadedInvocation(s)).get(); 
} catch (InterruptedException | ExecutionException ex) { 
    ex.printStackTrace(); 
} 

MultithreadedInvocation.java

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Socket; 
public class MultithreadedInvocation implements Runnable{ 
//initialize in const'r 
private final Socket socket; 

public MultithreadedInvocation(Socket s) { 
    this.socket=s; 
} 

@Override 
public void run() { 
    try {   
     DataInputStream din=new DataInputStream(socket.getInputStream()); 
     DataOutputStream dout=new DataOutputStream(socket.getOutputStream()); 
     BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
     int str; 
     str=din.read(); 
     String name=din.readUTF(); 
     System.out.println("Client Name = "+name); 
     System.out.println("Actual Client requested for file index "+str+"."); 
     ClientInfo ci = new ClientInfo(); 
     ci.ClientName=name; 
     ci.ClientFileChoice=str; 
     String fileName = new FileMapping().lookupFile(str); 
     File tempFile=new File("C:\\Users\\server-3\\Desktop\\List\\"+fileName); 
     dout.writeLong(tempFile.length()); 
     dout.flush(); 
     din.close(); 
     dout.close(); 
     socket.close(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 
} 

Что будет с моим 6-нить в этом case, будет ли он автоматически добавлен к этому unknown queue, или пул потоков завершится, и он не будет функционировать дальше?

+0

Вы сохранили 'ExecutorService, как **' обслуживания окончательный **, а также вы присваиваете новые значения для обслуживания 'обслуживания = Executors.newFixedThreadPool (5)' в то время как цикл. Не ясно, что вы делаете? –

+0

@ NamanGala-Извините, это была ошибка, и я хотел добавить эту строку в комментарии, оставил ее. В любом случае, я отредактировал вопрос и удалил «final» из ExecutorService ... Пожалуйста, ответьте сейчас. – asad

+1

Вы должны выполнить инициализацию ExecutorService из цикла while. –

ответ

2

Если у вас есть 5 потоков, тогда решите запустить цикл, который может вызывать до 30 потоков, эти процессы помещаются в очередь и ждут, когда поток станет доступным.

Ваша 6-я нить будет ждать, пока ранее представленный поток не завершится или отменен.

Previous post.

+0

Куда он будет ждать? Это главный вопрос? Любая автоматическая очередь по умолчанию, предоставляемая JVM внутри? Пожалуйста, помогите объяснить это внутреннее. Мне нужно внутреннее объяснение. – asad

+1

@asad «Задачи подаются в пул через внутреннюю очередь, которая содержит дополнительные задачи, когда есть более активные задачи, чем потоки» https://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html – Pumphouse

+0

Спасибо, он многое помог ... Приобретен и принят. – asad