大家好,我遇到了一个问题需要解决。在我做的一个应用中用到了多线程,这些线程分别执行一些数据库的事务操作。由于程序是与另一个A系统在一台机器上运行的,所以当A系统特别繁忙的时候,就要暂停这个程序的执行。我打算暂停这个程序的时候立即把所有的线程终止,当线程正在执行事务操作的时候,先roolback然后再终止,请问该怎么做到?
线程要做的事情大概是这样:
public Task implements Runnable {  public void run() {
    // 数据库操作
  }}

解决方案 »

  1.   

    当线程运行完成后就终止了,你可以在系统里判断,如果A系统忙,在事物回滚后程序能够运行完成,就是run方法执行完成。比如可以通过抛异常的方式。
      

  2.   

    可以用线程的interrupt()方法啊! 
      

  3.   

    To 2#:
    线程执行sql语句的时间会非常长,在线程执行sql语句期间是没有办法相应中断请求的,我想立即终止线程。
      

  4.   

    线程不是有3中终止方法吗,1为interrupt(),2为线程运行完成 3 线程跑出异常。
      

  5.   

    To 5#:
    interrupt()不能使线程终止。
      

  6.   

    interrupt只是告诉线程一个终止信号,具体终止不终止还是有线程自己决定
      

  7.   

    这个sql语句的执行强制终止不了
      

  8.   

    这个问题可以从另一个角度来解决,比如把SQL语句分割成执行时间可以在接受范围内的子SQL语句,这样就能及时响应中断请求了,但我很想知道该怎么解决前面这种情况,因为这招不是能解决所有类似问题的,比如执行某些IO操作
      

  9.   

    可不可以这样解决:
    通过调用Thread.stop(aThrowable)方法在线程中抛出异常,然后在run方法中捕获该异常来做一些清理工作,这样应该能够达到目的。
      

  10.   

    void stop() 
              已过时。 该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。有关更多信息,请参阅为何不赞成使用  你的SQL多找线程给它运行行不
    A线程调用SQL线程,现在要把SQL线程终止,直接从A返回,至于SQL线程是该抛异常还是让它跑完,自己决定
      

  11.   

    哦,复制错方法了,下面那个才是
    stop(Throwable obj) 
              已过时。 该方法具有固有的不安全性。有关详细信息,请参阅 stop()。该方法的附加危险是它可用于生成目标线程未准备处理的异常(包括若没有该方法该线程不太可能抛出的已检查的异常)。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?。
      

  12.   

    stop方法的工作机制导致它是不安全的,但是在某些情况下也不是完全没用的不是吗。
    我觉得它在这里能解决问题,反正我对所有线程要执行的任务都是知根知底的,也不担心stop会破坏数据的一致性。
      

  13.   

    API中提出的替代方案反而解决不了这个问题。
      

  14.   

    可以在事务线程中捕获stop方法造成的异常,然后事务回滚。
      

  15.   

    这个观点不能苟同,试想一个GUI界面在显示你正在处理的任务,当点击取消按钮后,难道还要等到这个任务执行完毕以后才能终止吗?是否要终止这个线程是要在线程之外来控制的。