一些背景知识:PropertyFunction
是interface in Jena API,允许使用SPARQL语法执行自定义操作。例如:
select ?result { ?result f:myPropertyFunction 'someObject' . }
所以我创建了一个实现此接口的类Launch
并扩展了一个类Client
。在我exec
类的Launch
方法的主体内,我建立了与服务器的连接,并且在发送信息时没有问题,等待服务器响应。每当我尝试wait()
进行服务器响应时,我都会遇到以下异常:java.lang.IllegalMonitorStateException
。
以下是我的exec
方法的正文:
QueryIterator it = null;
try {
this.connect(); // works well
this.send(algorithmAndArgs); // works well
this.wait(); // exception is thrown
@SuppressWarnings("unused")
ResultSet rs = ResultSetFactory.create(it, Arrays.asList(resultIdentifiers));
} catch (Exception e) {
e.printStackTrace();
}
return it;
任何人都知道问题可能是什么?谢谢你的回答。
编辑1:我忘了提到的一件事是Client
类有一个名为onObjectReceived(Object o, Socket s)
的方法,每次从服务器收到一些东西时都会触发。我尝试在isDone
方法中使用带有while
循环的exec
变量,并在收到对象后将其设置为true,但它不起作用。
答案 0 :(得分:1)
我解决了自己的问题:我创建了一个属性private final CountDownLatch objectWasReceivedLatch = new CountDownLatch(1)
,当我想等待响应时,在exec
方法中我boolean objectWasReceived = objectWasReceivedLatch.await(60, TimeUnit.SECONDS);
。我在onObjectReceived
方法中调用了objectWasReceivedLatch.countDown()
。