【发布时间】:2011-04-07 08:13:12
【问题描述】:
我有一个使用临时表(存在于用户会话范围内)和复杂数据处理的应用程序。
出于调试目的,我需要在应用程序处理期间对此临时表执行查询。
我添加了一些额外的逻辑作为方面 (AspectJ) 并在 Eclipse 中将我的应用程序作为加载时编织应用程序运行(使用 AJDT/JDT 编织插件)。
我执行以下操作:获得新连接后,我使用 gui 创建另一个线程并将连接传递给它(稍后将描述)。
每次查询后,主应用程序线程等待来自 gui 线程的消息以继续工作(这让我有机会进行查询并在临时表中查看中间结果)。消息传递是使用 BlockingQueue 实现的。
在 GUI 中,我有一个带有用于查询的文本区域的框架和两个按钮“运行查询”和“释放主线程”。
我希望按下“运行查询”按钮将执行查询并在框架上显示结果。并按下“释放主线程”按钮将消息发送到主线程以继续工作。
问题是当主线程正在等待blockingQueue.take()时,按下“运行查询”按钮会导致框架冻结并且什么都不做(看起来gui变得没有响应)。
当主线程等待blockingQueue.take()时,“释放主线程”分叉很好(但不是在“运行查询”按下之后)。
当主线程运行时(我在队列中放了很多对象),“运行查询”按钮正常工作,我可以看到查询结果。
起初我尝试使用 EDT 和事件调度进行操作,但没有任何帮助。你对这个问题有什么想法吗?
//aspect on 'newConnection' pointcut
after() returning (final Connection connection): newConnection() {
gUI = new Runnable() {
public void run() {
new GuiView(blockingQueue, connection);
}
};
SwingUtilities.invokeLater(gUI);
}
//GuiView code extract for button with query data retrieval action
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
try {
ResultSet rs = ConnectionManipulator.executeStatement(
queryTextAreaG.getText()
);
///....result parsing logic
} catch (SQLException e1) {
JOptionPane.showMessageDialog(null, "Exception!");
} finally {
}
//....result out logic
}
});
【问题讨论】:
-
如果您显示一些您正在做的事情的代码,会更容易回答您的问题;您的文字描述没有为可以提供帮助的人提供足够的提示。
标签: java eclipse events swing concurrency