根据this explanation given in Javadocs,它说下面的内容
public static 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个线程会发生什么,它会自动添加到 unknown queue
,还是线程池将终止,它将不会进一步运行?
1 回答
如果你有5个线程,那么决定运行一个最多可以调用30个线程的循环,这些进程被放入队列并等待线程变为可用 .
您的第6个线程将等待,直到先前提交的线程完成或取消 .
Previous post.