问题描述:想要合理终止一个线程。目前有一个数据库查询方法 doSomething() ;耗时很久。
想在界面上做一个按钮,在查询过程中可以取消查询。
于是我开启了一个线程来执行doSomething()查询。
但是无法终止线程尝试方法
1 stop(),方法不安全,已经过时,而且调用之后正在执行数据查询中会抛出SqlException2 isInterrupted() 数据库查询中耗时的一句是 stmt.executeQuery() 这句并没有阻塞,所以isInterrupted无效。3 使用线程标记,代码如下,这样做doSomething至少要执行一次,其实我也只是要让他执行一次就够了,而终止操作是希望在一次执行之中。
boolean flag = ture
while( flag )
{
doSomething() ;
}
希望各位给出合适的方案
解决方案 »
- 求解答
- 怎样用IO流传各种文件
- 如何获取当前程序文件的路径
- 哪位大侠帮我解释一下结果是怎么来的
- 这个线程为什么不执行
- 数据转换问题
- 求圆周率 Pi (π)值,精确到小数点后1000位 ---分不够可以再加
- 请教eclipse的优化问题,有gc日志和启动参数。
- "BorrowerInformation.java": Error #: 300 : class Persistent not found in class bo.BorrowerInformation
- 请教JAVA小问题:如何将含数字的String类型的对象转化为int或long类型
- JTable选择一行,输入数字,自动向前移动一位
- elicpse写java se程序 运行程序,,每次运行程序都关了
do
{
doSomething() ;
}
while( flag )
Result rs = statement.executeQuery()这一句在执行查询,程序就在这一直在运行。但并不是阻塞。
有什么办法能在这一句终止。
你说的不对,interrupt()中是将正在阻塞的线程中断,不再继续阻塞,如调用了wait() sleep()的线程。但线程还是会执行完的。
一个线程可以使用此方法结束别一个线程正在执行的语句。
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();
实在不行可以考虑使用异步线程