Java 如何知道线程何时停止或被停止?

Java 如何知道线程何时停止或被停止?,java,database,multithreading,runnable,executors,Java,Database,Multithreading,Runnable,Executors,我有下一个代码: Executor exe = Executors.newFixedThreadPool(20); while (true) { try { exe.execute(new DispatcherThread(serverSocket.accept())); continue; } catch (SocketException sExcp) { System.exit(-1); } catch (Exception exc

我有下一个代码:

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个连接),我需要知道的是当线程停止或停止或完成其流时如何关闭到数据库的连接。

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

一个
finally
块将确保在run()方法退出时发生

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

您可以在
run()
方法的末尾关闭特定于线程的连接

一个
finally
块将确保在run()方法退出时发生

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

您无法直接知道线程何时停止,最接近的是
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\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
        }
    }
}

顺便说一下,对于技术上不是线程的类来说,线程后缀不是一个好名字(因为它不是从扩展而来的)。相反根据应该做的事情给出一个正确的名称。

我建议关闭连接作为线程工作的一部分,并对失败的情况进行一些额外的异常处理。为什么runnable的run方法的最后一行不能关闭它打开的数据库连接?我建议关闭连接作为线程的一部分工作并对失败案例执行一些额外的异常处理。为什么runnable的run方法的最后一行不能关闭它打开的数据库连接?但是如果线程不是由自身(通过返回或异常)停止的,而是由另一个线程停止的呢?
finally
块还会运行吗?@Jashaszun如果您使用的是Thread.stop(),则不会。该方法已弃用,而且本质上不安全。另一个线程可以向线程发出停止的信号,此时它可以停止工作,并继续到最后一个块。@LuiggiMendoza-该链接包含Jashaszun问题的答案,但隐藏在注释中。@Andythonas那么这不是正确的答案,因为当连接完成时,它不一定关闭连接。但是如果线程停止了,而不是由它自己(通过返回或异常),而是由另一个线程停止了,该怎么办?
finally
块还会运行吗?@Jashaszun如果您使用的是Thread.stop(),则不会。该方法已弃用,而且本质上不安全。另一个线程可以向线程发出停止的信号,此时它可以停止工作,并继续到最后一个块。@LuiggiMendoza-该链接包含Jashaszun问题的答案,但隐藏在注释中。@Andythonas那么这不是正确的答案,因为这样做的时候,不一定会关闭连接。我认为这个答案是不正确的。有关详细信息,请参见我对另一个答案的评论。@Jashaszun我想是的。详情见我对另一个答案的答复。我认为你的回答有点误导。实际上,您可以通过
thread.isAlive()
确定线程是否已停止。这里的问题是,由于
Exector.execute
采用
Runnable
(而不是
线程
)调用方无法访问
Runnable
中的代码实际执行的线程。即使您这样做了,在执行
Runnable
之后,该线程也很可能不会消失。它很可能会返回到池中供将来使用(当然取决于实现),因此您真的不在乎线程何时结束。这是误导性的,因为1)您声明无法判断线程何时结束,实际上何时结束,2)尽管OP询问如何知道线程何时停止,您没有提到由于执行器的工作方式,关于线程停止的知识是不相关的。@mattforsyth from:线程在其
run()
方法的末尾或调用
stop()
时“死亡”,这是真的。调用
isAlive()
在这里对您没有帮助,调用
Thread#stop
也没有帮助,因为您在使用
ExecutorService
时无法控制线程。另外,一开始关闭线程外的资源是一个坏主意,所以这样的答案是误导性的。我认为这个答案是不正确的。有关详细信息,请参见我对另一个答案的评论。@Jashaszun我想是的。详情见我对另一个答案的答复。我认为你的回答有点误导。实际上,您可以通过
thread.isAlive()
确定线程是否已停止。这里的问题是,由于
Exector.execute
采用
Runnable
(而不是
线程
)调用方无法访问
Runnable
中的代码实际执行的线程。即使您这样做了,在执行
Runnable
之后,该线程也很可能不会消失。它很可能会返回到池中供将来使用(当然取决于实现),所以您真的不在乎该线程何时运行