Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 执行器服务中的队列工作';s newFixedThreadPool()?_Java_Multithreading_Queue_Executorservice_Threadpoolexecutor - Fatal编程技术网

Java 执行器服务中的队列工作';s newFixedThreadPool()?

Java 执行器服务中的队列工作';s newFixedThreadPool()?,java,multithreading,queue,executorservice,threadpoolexecutor,Java,Multithreading,Queue,Executorservice,Threadpoolexecutor,根据,它说了以下关于 公共静态执行器服务newFixedThreadPool(int-nThreads) 创建一个线程池,该线程池重用固定数量的操作线程 离开共享的无界队列。在任何时候,最多读取个线程 将是活动的处理任务。如果提交了其他任务 当所有线程都处于活动状态时,它们将在队列中等待,直到 线程是可用的。如果任何线程在运行期间由于故障而终止 在关闭前执行,如果需要,将替换一个新的 执行后续任务。池中的线程将一直存在到 它是显式关闭的 他们在谈论哪个队?如果我在多线程应用程序中不使用任何队列,

根据,它说了以下关于

公共静态执行器服务newFixedThreadPool(int-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();   
}
多线程度假.java


在这种情况下,我的第6个线程会发生什么情况?它会自动添加到该
未知队列中吗?或者线程池将终止,并且它将无法继续工作???

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

您的第6个线程将等待以前提交的线程完成或取消


您已将
ExecutorService服务
保留为最终服务,并且您正在为服务
service=Executors分配新值。newFixedThreadPool(5)在while循环中。不清楚你在做什么?@NamanGala抱歉,这是个错误,我想在评论中添加这一行,留下了。无论如何,我已经编辑了这个问题,并从ExecutorService中删除了
final
。。。请现在回答。您必须从while循环中取出ExecutorService的初始化。@NamanGala这样做了,还有什么?谢谢你的帮助。如果你足够自信,我请求你写一个答案……我只是在帮你调试代码。现在您已经初始化了Fixed5线程的ExecutorService。现在做一件事,而不是使用whileforinfinite循环,您可以使用for循环执行它10次,并查看一次有多少线程处于活动状态。并尝试在
多线程职业
构造函数和套接字中添加线程号,并向其中分配不同的线程号。在run方法中,您可以将sysout入口和出口与ID号一起显示。它将在哪里等待?这是主要问题吗?JVM内部是否提供了任何自动默认队列?请仔细解释一下你内心的想法。我需要内部解释。@asad”任务通过内部队列提交到池中,默认情况下,当活动任务多于“线程”LinkedBlockingQueue时,该队列会保存额外的任务。我做了一个System.out.println(executor.getQueue().getClass())。
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();
    }
}
}