huangfox

冰冻三尺,非一日之寒!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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。

 

 

  

 

posted on 2012-06-15 10:23  huangfox  阅读(2992)  评论(0编辑  收藏  举报