Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么处于阻塞状态的线程不会被中断?_Java_Multithreading_Wait_Interrupt_Blocked - Fatal编程技术网

Java 为什么处于阻塞状态的线程不会被中断?

Java 为什么处于阻塞状态的线程不会被中断?,java,multithreading,wait,interrupt,blocked,Java,Multithreading,Wait,Interrupt,Blocked,我正在用java进行多线程处理。 想了解线程是否处于阻塞状态,为什么不能中断?为什么线程只有在等待状态下才能被中断?基本上,为什么我们需要两个线程状态,一个可以中断,另一个不能中断 这个问题可能很基本,但我试着去理解事物,而不是仅仅记住它们 被阻止的线程可以接收中断。您可能必须检查Thread.currentThread().interrupted(),以查看线程在等待获取任何资源时是否被中断 另请参见Lock::lockinterruptbly()阻塞的线程可以被中断。下面是根据线程的状态对其

我正在用java进行多线程处理。 想了解线程是否处于阻塞状态,为什么不能中断?为什么线程只有在等待状态下才能被中断?基本上,为什么我们需要两个线程状态,一个可以中断,另一个不能中断


这个问题可能很基本,但我试着去理解事物,而不是仅仅记住它们

被阻止的线程可以接收中断。您可能必须检查
Thread.currentThread().interrupted()
,以查看线程在等待获取任何资源时是否被中断


另请参见
Lock::lockinterruptbly()
阻塞的线程可以被中断。下面是根据线程的状态对其调用中断的方式。发件人:

调用此线程的checkAccess方法,这可能会导致 要抛出的SecurityException

如果该线程在wait()的调用中被阻塞,wait(long), 或对象类或join()的wait(long,int)方法, join(long)、join(long,int)、sleep(long)或sleep(long,int)方法 则其中断状态将被清除,并且 接收中断异常

如果此线程在I/O操作中因可中断事件而被阻塞 然后通道将关闭,线程的中断状态 将被设置,并且线程将接收ClosedByInterruptException

如果该线程在选择器中被阻塞,则该线程的中断 将设置状态,并立即从选择返回 操作,可能使用非零值,就像选择器 已调用唤醒方法

如果前面的条件都不成立,那么这个线程的中断 将设置状态

中断一个非活动线程不需要有任何效果

抛出:SecurityException-如果当前线程无法修改此 线


假设您的意思是使线程停止其当前操作并抛出
中断异常
?Java中的线程中断只是一个标志。您可以在被阻止的线程上调用
interrupt()
,该标志将在下次代码检查时显示

实现这种功能的主要问题是,关键字(
synchronized
)应该如何引发异常
InterruptedException
是一个选中的异常,必须用
抛出InterruptedException
声明语言中的每个同步方法(和块)将不是一个有用的练习


中断是一种通信工具,通常用于让线程知道需要检查的系统状态。该名称是硬件内设置的标志的遗留遗留遗留/向上扩展,用于让微处理器了解需要检查的特定状态(例如在某些输入引脚上设置的新值)。不要对“interrupt”这个名称读得太多,而认为它是用来中断另一个线程中的程序流的工具。事实并非如此。因此,即使抛出异常的方法将其声明为已检查,另一个线程也可以随意忽略它,并在需要时继续等待。能够任意中断另一个线程的
BLOCKED
状态会中断程序流,而这不是目的。

可以通过调用thread classs的interrupt()方法中断被阻塞的线程。您可以发布示例代码吗,线程堆栈等?哪个笨蛋决定调用这个标志/通知函数“中断”?谢谢@aff。最近我遇到了一个线程死锁的情况。我还有一个watcher线程,它在一定时间间隔后执行“Future.canel(true)”。虽然调用了“timeout Exection Occursed”和“future.cancel(true)”,但死锁线程并未停止。所以我在想,如果另一个线程无法停止,“中断”的实际用途是什么。如果您直接从使用
synchronized
升级到使用java.util.concurrent包,那么您可能会导致从阻塞锁获取中抛出InterruptedException。