2011-05-27 208 views
1

我试图用游戏实现Java Swing GUI应用程序。游戏将计算5秒钟内点击一次按钮的次数。sqlite4java多线程支持解决方案

我在我的一个Java GUI项目中使用了sqlite4java。它非常简约,因此仅支持单线程应用程序。

我想在5秒钟后执行一些SQL查询。我有一个线程在我的按钮的onclick监听其run()方法等实现开始执行以下操作:

run() { 
timeLeft = 5; 
score = 0; 
while(timeLeft>0) 
     Thread.sleep(100); 
     timeLeft -= 0.1; 
     update left time on GUI; 
    } 
    // time is up 
    execute some SQLite INSERT query here; 
} 

而且由于sqlite4java是支持单线程,它抛出一个异常:

SQLite error:com.almworks.sqlite4java.SQLiteException: 
[-98] DB[1] confined(Thread[main,5,]) used (Thread[Thread-3,6,main]) 

如何线程完成后(线程外)可以执行吗?它抛出异常,因为被调用者线程和数据库实例化的线程(主线程)不相同。

在线程终止后,如何让主线程发出信号(并在主线程中处理此信号)?

我想要实现的是执行查询将用户的分数添加到高分列表中。这不是一项家庭作业,我正在为自己的ORM框架开发一个概念验证应用程序。

回答

8

正如@corlettk建议的那样,您需要为数据库操作提供单独的线程。 sqlite4java附带SQLiteQueue,它为你做到了这一点。有一个tutorialjavadoc with example

确保使用SQLiteJob包装所有数据库操作并将它们传递给队列。

希望这会有所帮助! Igor

0

艾哈迈德,

我想你必须在一个线程中,这也许应该专注于这个目的做你的“数据库的东西”(包括DIS /连接);甚至可能“隐藏”在请求队列后面。

祝你好运。你能“交换”RDBMS吗?

干杯。基思。

+0

@Keith,其实我试图找到一种方法来进行线程之间的沟通。 sqlite4java不允许在其他线程上执行。我可能会实现一个请求队列并使用'.wait()'和'.notifyAll()'处理它。但寻找更优雅的解决方案。谢谢。 – 2011-05-27 23:49:23

+0

@Ahmit,http://code.google.com/p/sqlite4java/说:“[An]应用程序可能会从不同线程打开多个连接到同一个数据库的连接。”对我而言,这意味着您可以在专用的“DB服务线程”上打开数据库,然后在线程安全的请求队列后面“隐藏”该线程。每个请求将是一个未来,允许您回读结果,并检查错误。它仍然非常糟糕(延迟的错误检测),但它可以工作,我猜。 – corlettk 2011-05-28 00:00:29

相关问题