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