Runnable 中的中断也会中断其他线程吗?
Interrupt in Runnable interrupts other threads as well?
我有一个 class MyRunnable
实现了 Runnable
接口。 class 是从主线程实例化的,如下所示:
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread( myRunnable );
thread.start();
MyRunnable
实现一个 stop()
方法,该方法停止线程并在当前线程上调用 interrupt()
:
public void stop()
{
LOG.info( "Stopping" );
this.runService = false; // reset running flag in order to stop the while-loop
Thread.currentThread().interrupt(); // interrupt any blocking operations
}
但是,中断线程会导致一些我无法理解的重大问题。我注意到不仅这个线程被中断了,其他所有线程也被中断了,包括主线程!这导致数据库连接中断,与此线程等没有任何关系。当我删除中断调用时,一切都按预期工作。
我认为创建/启动/停止 Runnable 非常简单,但也许我做错了什么?
您可能正在从主线程调用 myRunnable.stop()
。这将导致 Thread.currentThread().interrupt()
简单地中断主线程。
您不应假设该方法中的调用线程。如果您的意图是实际中断为执行您的可运行对象而实例化的线程,您应该以某种方式将 thread
引用传递给您的 Runnable
实现并调用 thread.interrupt()
而不是弄乱 currentThread()
.
我有一个 class MyRunnable
实现了 Runnable
接口。 class 是从主线程实例化的,如下所示:
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread( myRunnable );
thread.start();
MyRunnable
实现一个 stop()
方法,该方法停止线程并在当前线程上调用 interrupt()
:
public void stop()
{
LOG.info( "Stopping" );
this.runService = false; // reset running flag in order to stop the while-loop
Thread.currentThread().interrupt(); // interrupt any blocking operations
}
但是,中断线程会导致一些我无法理解的重大问题。我注意到不仅这个线程被中断了,其他所有线程也被中断了,包括主线程!这导致数据库连接中断,与此线程等没有任何关系。当我删除中断调用时,一切都按预期工作。
我认为创建/启动/停止 Runnable 非常简单,但也许我做错了什么?
您可能正在从主线程调用 myRunnable.stop()
。这将导致 Thread.currentThread().interrupt()
简单地中断主线程。
您不应假设该方法中的调用线程。如果您的意图是实际中断为执行您的可运行对象而实例化的线程,您应该以某种方式将 thread
引用传递给您的 Runnable
实现并调用 thread.interrupt()
而不是弄乱 currentThread()
.