Encountered <EOF> 这个异常通常会出现在多线程并发使用同一个queryParser对象时发生。
可以通过以下实验进行验证。
static QueryParser parser;
static {
Analyzer a = new IKAnalyzer();
parser = new QueryParser(Version.LUCENE_36, "f", a);
}
@Override
public void run() {
long bt = System.currentTimeMillis();
try {
for (int i = 0; i < 100000; i++) {
Query q = null;
q = parser.parse("食品级达标全叶芦荟");
// System.out.println(q);
}
} catch (ParseException e) {
e.printStackTrace();
}
long et = System.currentTimeMillis();
System.out.println(et - bt);
}
启动N个线程,一般刚开始就会排出这个异常。
解决办法一般有两个:
1.每个线程使用“独占”的queryparser对象,不进行公用。
2.公用queryparser对象,但提供一个同步的解析方式。
经过测试,方式二效率较低一点,10万次解析慢10s左右(需要考虑测试机器问题,本测试机器为pc机)。
不过方式二较易控制,且一定程度上减少GC。