大家好,我遇到了一个问题需要解决。在我做的一个应用中用到了多线程,这些线程分别执行一些数据库的事务操作。由于程序是与另一个A系统在一台机器上运行的,所以当A系统特别繁忙的时候,就要暂停这个程序的执行。我打算暂停这个程序的时候立即把所有的线程终止,当线程正在执行事务操作的时候,先roolback然后再终止,请问该怎么做到?
线程要做的事情大概是这样:
public Task implements Runnable { public void run() {
// 数据库操作
}}
线程要做的事情大概是这样:
public Task implements Runnable { public void run() {
// 数据库操作
}}
线程执行sql语句的时间会非常长,在线程执行sql语句期间是没有办法相应中断请求的,我想立即终止线程。
interrupt()不能使线程终止。
通过调用Thread.stop(aThrowable)方法在线程中抛出异常,然后在run方法中捕获该异常来做一些清理工作,这样应该能够达到目的。
已过时。 该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。有关更多信息,请参阅为何不赞成使用 你的SQL多找线程给它运行行不
A线程调用SQL线程,现在要把SQL线程终止,直接从A返回,至于SQL线程是该抛异常还是让它跑完,自己决定
stop(Throwable obj)
已过时。 该方法具有固有的不安全性。有关详细信息,请参阅 stop()。该方法的附加危险是它可用于生成目标线程未准备处理的异常(包括若没有该方法该线程不太可能抛出的已检查的异常)。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?。
我觉得它在这里能解决问题,反正我对所有线程要执行的任务都是知根知底的,也不担心stop会破坏数据的一致性。