【问题标题】:How to know when a thread stops or is stopped?如何知道线程何时停止或停止?
【发布时间】:2014-07-09 19:13:50
【问题描述】:

我有下一个代码:

Executor exe = Executors.newFixedThreadPool(20);
while (true) {
   try {
       exe.execute(new DispatcherThread(serverSocket.accept()));
       continue;
   } catch (SocketException sExcp) {
       System.exit(-1);
   } catch (Exception excp) {
       System.exit(-1);
   }
}

对于每个DispatcherThread,我都会创建一个到数据库的连接(这意味着我有 20 个连接),我需要知道的是,当线程停止或停止或完成它时,我如何关闭与数据库的连接流。

【问题讨论】:

  • 我建议关闭连接作为线程工作的一部分,并为失败的情况做一些额外的异常处理。
  • 为什么你的runnable的run方法的最后一行不能关闭它打开的数据库连接?

标签: java database multithreading runnable executors


【解决方案1】:

您无法直接知道线程何时停止,最接近的是Thread#isAlive 方法,但当线程中的run 方法完成但线程可能不会停止时,它可能会返回false,因为JVM 无法保证。但是如果你的DispatcherThread 类实现了Runnable 接口,那么你可以在run 方法的底部编写清理。

骨架代码:

class DispatcherThread implements Runnable {
    @Override
    public void run() {
        try {
            //open database connection an such...
            //...
            //handle the work here...
        } catch (...) {
            //ALWAYS handle the exceptions
        } finally {
            //cleanup tasks like close database connection
        }
    }
}

顺便说一下,Thread 后缀对于技术上不是线程的类来说并不是一个好名字(因为它不是从Thread 扩展而来的)。取而代之的是,根据应该做的事情给一个合适的名字。

【讨论】:

  • 我认为这个答案是不正确的。有关详细信息,请参阅其他答案上的我的 cmets。
  • @Jashaszun 我认为是。有关详细信息,请参阅我对其他答案的回复。
  • 我认为你的回答有点误导。您实际上可以通过thread.isAlive() 确定线程是否已停止。这里的问题是,由于Exector.execute 采用Runnable(不是Thread),调用者无权访问Runnable 中的代码实际执行的线程。即使你这样做了,一旦执行完你的Runnable,该线程很可能不会消失。它很可能会回到池中以供将来使用(当然取决于实现),因此您真的不在乎该线程何时结束。
  • 它具有误导性,因为 1.)您声明无法判断线程何时完成,实际上何时完成,以及 2.)尽管 OP 询问如何知道何时线程停止,您没有提到线程停止的知识与执行器的工作方式无关。
  • @mattforsythe from here线程在其run() 方法结束时“死亡”,或者在调用stop() 时。,即 真的。在这里调用isAlive() 对您没有帮助,也不会调用Thread#stop,因为在使用ExecutorService 时您无法控制线程。另外,一开始就关闭线程外的资源是个坏主意,所以这样的回答会产生误导。
【解决方案2】:

您可以在 run() 方法结束时关闭特定于线程的连接。

finally 块将确保它发生,但 run() 方法退出。

class DispatcherThread extends Runnable {
    public void run() {
       ...
       try {
          ...
       }
       finally {
            // Close the connection
       }
    }

【讨论】:

  • 但是如果线程停止,不是由它自己(通过返回或异常),而是由另一个线程停止呢? finally 块还会运行吗?
  • 如果你使用的是 Thread.stop(),那么没有。该方法已被弃用并且本质上是不安全的。另一个线程可以通知线程停止,此时它可以停止工作,并继续执行 finally 块。
  • @LuiggiMendoza - 该链接包含对 Jashaszun 问题的答案,但它隐藏在评论中。
  • @AndyThomas 那么这不是正确答案,因为完成后不一定会关闭连接。
猜你喜欢
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多