在ExecutorService的newFixedThreadPool()中处理队列?

时间:2015-07-31 05:58:47

标签: java multithreading queue executorservice threadpoolexecutor

根据this explanation given in Javadocs,它说明以下内容

public static ExecutorService newFixedThreadPool(int nThreads)

  

创建一个重用固定数量的线程的线程池   关闭共享的无界队列。在任何时候,最多nThreads线程   将是主动处理任务。如果提交了其他任务   当所有线程都处于活动状态时,它们将在队列中等待直到a   线程可用。如果任何线程由于故障期间终止而终止   在关机之前执行,如果需要,新的将取代它   执行后续任务。池中的线程将一直存在   它是明确关闭的。

他们在谈论哪个队列?如果我在多线程应用程序中没有使用任何队列,如下所示:

,该怎么办?
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 个答案:

答案 0 :(得分:2)

如果您有5个线程,则决定运行一个最多可调用30个线程的循环,这些进程将被放入队列并等待线程变为可用。

您的第6个帖子将等到之前提交的帖子完成或取消。

Previous post.