关于JAVA多线程问题的请教,有劳名位,重金酬谢。^_^

aladdinty 2010-08-05 04:42:35
问题描述:想要合理终止一个线程。

目前有一个数据库查询方法 doSomething() ;耗时很久。
想在界面上做一个按钮,在查询过程中可以取消查询。


于是我开启了一个线程来执行doSomething()查询。
但是无法终止线程

尝试方法
1 stop(),方法不安全,已经过时,而且调用之后正在执行数据查询中会抛出SqlException

2 isInterrupted()
doSometing()里耗时的一句就是
Result rs = statement.executeQuery()

这一句在执行查询,程序就在这一直在运行。但并不是阻塞。



3 使用线程标记,代码如下,这样做doSomething至少要执行一次,其实我也只是要让他执行一次就够了,而终止操作是希望在一次执行之中。

boolean flag = ture
while( flag )
{
doSomething() ;
}


希望各位给出合适的方案
...全文
133 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pwl2014 2010-08-06
  • 打赏
  • 举报
回复
3 使用线程标记,代码如下,这样做doSomething至少要执行一次,其实我也只是要让他执行一次就够了,而终止操作是希望在一次执行之中。

boolean flag = ture
while( flag )
{
doSomething() ;
}
doSomething()应该可以拆分吧?在中间用Flag判断是否break
aladdinty 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chdw 的回复:]
doSometing()里耗时的一句就是
Result rs = statement.executeQuery()

这一句在执行查询,程序就在这一直在运行。但并不是阻塞。

---
这个保存起statement对象,在另外一个线程可以调用statement.cancel()中止SQL语句的支持(需要数据库本身支持)
[/Quote]

高见。。。谢!
ChDw 2010-08-05
  • 打赏
  • 举报
回复
doSometing()里耗时的一句就是
Result rs = statement.executeQuery()

这一句在执行查询,程序就在这一直在运行。但并不是阻塞。

---
这个保存起statement对象,在另外一个线程可以调用statement.cancel()中止SQL语句的支持(需要数据库本身支持)
coldbutterfly 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 aladdinty 的回复:]
数据很大,我已经限制范围了,但是依然很慢,所以才要做取消的。
[/Quote]

强烈建议,在表中建索引,优化SQL,我对线程不是很精通,但是觉得人为终止线程,不太合理。
aladdinty 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qingyuan18 的回复:]
线程的调度主要是wait()和notify()方法,

如果要终止线程,我觉得应该另外写一个dispose方法,毕竟你的ResultSet什么的都还没有关闭,点击按钮时直接执行dispose方法,这个方法执行完线程也就结束了,没必要强制关掉,否则容易引起数据库connection回收问题
[/Quote]


wait()与notify()很显明不适合现在这种情况。
难不成你要阻塞我的查询线程吗

我明白直接stop肯定会带来问题。
王铎开 2010-08-05
  • 打赏
  • 举报
回复
interrupt() 中断
qingyuan18 2010-08-05
  • 打赏
  • 举报
回复
线程的调度主要是wait()和notify()方法,

如果要终止线程,我觉得应该另外写一个dispose方法,毕竟你的ResultSet什么的都还没有关闭,点击按钮时直接执行dispose方法,这个方法执行完线程也就结束了,没必要强制关掉,否则容易引起数据库connection回收问题
aladdinty 2010-08-05
  • 打赏
  • 举报
回复
数据很大,我已经限制范围了,但是依然很慢,所以才要做取消的。
coldbutterfly 2010-08-05
  • 打赏
  • 举报
回复
你是不是数据库中数据量很大,只需要查一部分数据出来,所以才要终止的,可以优化你的SQL,之查前N条记录不就好了!

67,511

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧