中断java线程中的外部方法调用

中断java线程中的外部方法调用,java,multithreading,interrupt-handling,external-process,Java,Multithreading,Interrupt Handling,External Process,我的java程序使用了一个需要一段时间才能完成的外部方法(我没有源代码),因此我在一个Thread类(在其run方法中)中调用了该方法。现在的问题是,如果用户想要退出程序,我如何立即停止线程(而不是等待方法结束) 当我调用线程的中断方法时,什么都没有发生,在外部方法完成之前没有中断的异常。我认为一个中断的异常可能会在外部方法运行的同时发生并被捕获,但可能不会 我不确定线程到底是如何工作的。那么您如何解决这个问题呢?如果其他方法没有检查线程的中断位或提供其他一些取消机制,那么您无法停止其他方法的进

我的java程序使用了一个需要一段时间才能完成的外部方法(我没有源代码),因此我在一个Thread类(在其run方法中)中调用了该方法。现在的问题是,如果用户想要退出程序,我如何立即停止线程(而不是等待方法结束)

当我调用线程的中断方法时,什么都没有发生,在外部方法完成之前没有中断的异常。我认为一个中断的异常可能会在外部方法运行的同时发生并被捕获,但可能不会


我不确定线程到底是如何工作的。那么您如何解决这个问题呢?

如果其他方法没有检查线程的中断位或提供其他一些取消机制,那么您无法停止其他方法的进程。基本上,一个线程(即在其上运行的方法)需要与其他线程协作才能中断

但是,当所有非守护进程线程完成时,程序将立即结束。因此,如果您不想让另一个线程阻止退出进程,您只需在
start()
线程之前调用
thread.setDaemon(true)
。然后,您的守护进程线程(包括运行在中的
main
线程)可以完成它们需要执行的任何清理,并且您的程序将在不等待守护进程线程完成的情况下退出


EDIT:这个答案最初提到使用
Future
s,但忽略了OP的观点,即这是针对程序退出的特殊情况。如果您想阅读有关
未来
的内容,请查看此答案的历史记录。

如果其他方法没有检查线程的中断位或提供其他一些取消机制,那么您无法停止其他方法的进程。基本上,一个线程(即在其上运行的方法)需要与其他线程协作才能中断

但是,当所有非守护进程线程完成时,程序将立即结束。因此,如果您不想让另一个线程阻止退出进程,您只需在
start()
线程之前调用
thread.setDaemon(true)
。然后,您的守护进程线程(包括运行在中的
main
线程)可以完成它们需要执行的任何清理,并且您的程序将在不等待守护进程线程完成的情况下退出


EDIT:这个答案最初提到使用
Future
s,但忽略了OP的观点,即这是针对程序退出的特殊情况。如果您想阅读有关
未来
的内容,请查看此答案的历史记录。

如果其他方法没有检查线程的中断位或提供其他一些取消机制,那么您无法停止其他方法的进程。基本上,一个线程(即在其上运行的方法)需要与其他线程协作才能中断

但是,当所有非守护进程线程完成时,程序将立即结束。因此,如果您不想让另一个线程阻止退出进程,您只需在
start()
线程之前调用
thread.setDaemon(true)
。然后,您的守护进程线程(包括运行在中的
main
线程)可以完成它们需要执行的任何清理,并且您的程序将在不等待守护进程线程完成的情况下退出


EDIT:这个答案最初提到使用
Future
s,但忽略了OP的观点,即这是针对程序退出的特殊情况。如果您想阅读有关
未来
的内容,请查看此答案的历史记录。

如果其他方法没有检查线程的中断位或提供其他一些取消机制,那么您无法停止其他方法的进程。基本上,一个线程(即在其上运行的方法)需要与其他线程协作才能中断

但是,当所有非守护进程线程完成时,程序将立即结束。因此,如果您不想让另一个线程阻止退出进程,您只需在
start()
线程之前调用
thread.setDaemon(true)
。然后,您的守护进程线程(包括运行在中的
main
线程)可以完成它们需要执行的任何清理,并且您的程序将在不等待守护进程线程完成的情况下退出


EDIT:这个答案最初提到使用
Future
s,但忽略了OP的观点,即这是针对程序退出的特殊情况。如果您想阅读有关
未来的
s,请查看此答案的历史记录。

如果您使用的线程性能不好,您可以发布您的代码片段吗。中断将不起作用。如果调用System.exit,该线程将被中止。如果您使用的是一个性能不好的线程,您可以发布代码片段吗。中断将不起作用。如果调用System.exit,该线程将被中止。如果您使用的是一个性能不好的线程,您可以发布代码片段吗。中断将不起作用。如果调用System.exit,该线程将被中止。如果您使用的是一个性能不好的线程,您可以发布代码片段吗。中断将不起作用。如果调用System.exit,线程将被中止。请注意,用户询问了想退出程序的特殊情况,他可以使用
System.exit()
注意,用户询问了想退出程序的特殊情况,他可以使用
System.exit()执行此操作
注意,用户询问想退出程序的特殊情况,他可以使用
System.exit()
注意,用户询问想退出程序的特殊情况,他可以使用
System.exit()