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

aladdinty 2010-08-05 04:17:34

问题描述:想要合理终止一个线程。

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


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

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

2 isInterrupted() 数据库查询中耗时的一句是 stmt.executeQuery() 这句并没有阻塞,所以isInterrupted无效。

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

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


希望各位给出合适的方案
...全文
194 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
aladdinty 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 yuwenbao 的回复:]
你可以在另一个线程里面对同一个Statement对象,调用Statement.cancel()方法

具体可以看 http://onjava.com/pub/a/onjava/2004/06/16/dbcancel.html
[/Quote]

问题已经解决,不过你说的晚了。。


感谢大家。。。
yuwenbao 2010-08-05
  • 打赏
  • 举报
回复
你可以在另一个线程里面对同一个Statement对象,调用Statement.cancel()方法

具体可以看 http://onjava.com/pub/a/onjava/2004/06/16/dbcancel.html
aladdinty 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 michaellufhl 的回复:]
取消查询就显示‘取消画面’,为啥还要查询结果?
[/Quote]

取消了查询,也是结果。我指的是响应结果,不是数据
luozhangwen 2010-08-05
  • 打赏
  • 举报
回复
如果线程正在使用你去停止会出异常的.但是功能确实可以实现


ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new Thread()
{
public void run()
{
try
{
System.out.println("线程等待");
Thread.sleep(100000000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
});

System.out.println("线程停止!1");
request.getSession().setAttribute("lzw", executorService);




ExecutorService executorService= (ExecutorService) request.getSession().getAttribute("lzw");
executorService.shutdownNow();


实在不行可以考虑使用异步线程
michaellufhl 2010-08-05
  • 打赏
  • 举报
回复
取消查询就显示‘取消画面’,为啥还要查询结果?
aladdinty 2010-08-05
  • 打赏
  • 举报
回复
查到一个Statement里的方法 cancel()
一个线程可以使用此方法结束别一个线程正在执行的语句。
aladdinty 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bao110908 的回复:]
嗯,是的 interrupt 是中断阻塞的线程。但是数据库操作底层是 Socket 连接的,向数据库服务端发出请求后,JDBC 的客户端就会在那里阻塞着,直到数据库服务器的响应过来了。
[/Quote]


我很清楚的测试过,interrupt 中断不了 statement.executeQuery()
aladdinty 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 michaellufhl 的回复:]
其实中断jdbc操作是不常见的操作,所以不如控制界面,让用户感觉不到后台在继续操作。
[/Quote]

数据层没有结果,你的界面根据什么控制
michaellufhl 2010-08-05
  • 打赏
  • 举报
回复
其实中断jdbc操作是不常见的操作,所以不如控制界面,让用户感觉不到后台在继续操作。
  • 打赏
  • 举报
回复
嗯,是的 interrupt 是中断阻塞的线程。但是数据库操作底层是 Socket 连接的,向数据库服务端发出请求后,JDBC 的客户端就会在那里阻塞着,直到数据库服务器的响应过来了。
jypapgl 2010-08-05
  • 打赏
  • 举报
回复
坐等高人
aladdinty 2010-08-05
  • 打赏
  • 举报
回复
主线程可以使用 Thread#interrupt() 中断某个线程,但是这个线程是否会中断,或者何时中断都是无法控制的。


你说的不对,interrupt()中是将正在阻塞的线程中断,不再继续阻塞,如调用了wait() sleep()的线程。但线程还是会执行完的。
  • 打赏
  • 举报
回复
不能取消,除非在查询之前设定 setQueryTimeout 时间。不设定的话将会一直阻塞下去,直到达到默认的超时间。

有一种理念需要扶正一下,所有的线程级别都是一样的,并不存在谁控制谁的问题,主线程也没有更多的权力去控制子线程的状态。只要子线程在执行了,是不能中断的。主线程可以使用 Thread#interrupt() 中断某个线程,但是这个线程是否会中断,或者何时中断都是无法控制的。
aladdinty 2010-08-05
  • 打赏
  • 举报
回复
doSometing()里耗时的一句就是
Result rs = statement.executeQuery()

这一句在执行查询,程序就在这一直在运行。但并不是阻塞。
有什么办法能在这一句终止。
michaellufhl 2010-08-05
  • 打赏
  • 举报
回复
要跳出doSomething(),就要在doSomething()里面想办法.
aladdinty 2010-08-05
  • 打赏
  • 举报
回复
这不是一样还是执行了一次吗?我要的是只执行一次,而中断发生在这一次之中。
myloveyoyo1314 2010-08-05
  • 打赏
  • 举报
回复
boolean flag = ture
do
{
doSomething() ;
}
while( flag )
Kanepan 2010-08-05
  • 打赏
  • 举报
回复
帮LZ顶, 曾经也有同样需求

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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