Java BlockingQueue消息未处理未完全处理

Java BlockingQueue消息未处理未完全处理,java,multithreading,blockingqueue,Java,Multithreading,Blockingqueue,我试图处理一个文本文件中的几百万条记录(即,使用一个线程按顺序读取文件,并尝试使用多个线程处理检索到的行)。“queue.take();”之后的方法调用只执行与分配给BlockingQueue的初始容量相等的次数(本例中为100),然后进程不再拾取记录 能否请您帮助调试或确定问题 Main Method: ############ final int threadCount = 10; BlockingQueue<String> queue = new ArrayBlockingQu

我试图处理一个文本文件中的几百万条记录(即,使用一个线程按顺序读取文件,并尝试使用多个线程处理检索到的行)。“queue.take();”之后的方法调用只执行与分配给BlockingQueue的初始容量相等的次数(本例中为100),然后进程不再拾取记录

能否请您帮助调试或确定问题

Main Method:
############
final int threadCount = 10;
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(100);
ExecutorService service = Executors.newFixedThreadPool(threadCount);

for (int i = 0; i < (threadCount - 1); i++) {
    service.submit(new EvaluateLine(queue));
}
service.submit(new ProcessFile(queue)).get();
service.shutdownNow();
service.awaitTermination(365, TimeUnit.DAYS);


EvaluateLine:
#############
private final BlockingQueue<String> queue;

public EvaluateLine(BlockingQueue<String> queue){
    this.queue = queue;
}

@Override
public void run() {
    String line;
    while(true) {
        try {
            line = queue.take();
            SyncOutput.Process(line);
        } catch (InterruptedException ex) {
            break;
        }
    }
}

ProcessFile:
############
private final BlockingQueue<String> queue;

public ProcessFile(BlockingQueue<String> queue) {
    this.queue = queue;
}

@Override
public void run() {
    Path path = Paths.get("C:\\Desktop\\testdata.txt");
    BufferedReader br = null;

    try {
        br =Files.newBufferedReader(path, StandardCharsets.UTF_8);
        for (String line; (line = br.readLine()) != null; ) {
            queue.put(line);
        }
    } catch(IOException e){
        e.printStackTrace();
    } catch(InterruptedException e){
        e.printStackTrace();
    } finally{
        try {
            if (br != null) br.close();
        }catch(IOException e){
            e.printStackTrace();
        }
    }
以下代码段(使用表达式求值库:exp4j)正在阻止多线程执行,不确定原因。但是我用另一个库(parsii)替换了这个代码块,现在一切看起来都很好

public static void ProcessExpression(String inputLine) {
    evalExpression(inputLine);
}
public static double evalExpression(String s){
    Expression e = new ExpressionBuilder(s)
                   .build();
    return e.evaluate();
} 

SyncOutput
类的语法中有很多错误(synchronize未同步;void方法返回值;
SyncOutput.Process
被静态调用)。另外,
SyncOutput
类不完整,因此无法编译此代码以复制问题。如果您只是将
SyncOutput.Process
替换为
System.out.println
(并删除
SyncOutput
类),是否仍然会出现相同的问题?@AndyTurner我删除了附加的代码,只保留了调用exp4j api方法计算表达式的部分。此块似乎是导致问题的原因。根据您的建议,我已将SyncOutput.Process替换为System.out.println,并按预期执行。@AndyTurner我已将库更改为parsii,现在处理工作正常。感谢您的及时反馈
public static void ProcessExpression(String inputLine) {
    evalExpression(inputLine);
}
public static double evalExpression(String s){
    Expression e = new ExpressionBuilder(s)
                   .build();
    return e.evaluate();
}