2015-10-16 87 views
0

我想了解中断如何与Thread.sleep()和Thread.join()一起工作。如何中断和Thread.sleep()/ Thread.join()动作

例如,如果在一个线程,说t1,我执行Thread.sleep()后从另一个线程我叫t1.interrupt()然后Thread.sleep()抛出和InterruptException。

我想知道的是这一切的机制。正如我所看到的sleep()是一个静态方法,它如何检测到中断已发送到它所调用的线程?

对于案例t1.join()类似,该方法如何看到执行ti.join()的线程已收到中断并抛出异常?有没有一种联系?

+2

考虑到这是实施和特定平台,您希望从答案中获得哪些洞察?这怎么帮助你解决一些编程问题?即你的问题的根本动机是什么。 – the8472

+1

sleep是静态的,因为它只在当前运行的线程上调用它才有意义。当您查看Thread的源代码时,可以看到像sleep和wait这样的方法是本地方法。情况就是这样,因为os处理线程(如果它们是本地的,它们在java中)。所以基本上如果oyu调用中断,java会将该中断重定向到os,然后os会唤醒线程,然后java抛出异常。 –

+0

“本地方法”是什么意思?然而,我不明白的是,Thread.sleep如何理解哪个线程进入睡眠状态,以及如何提取这些信息。 – zer0uno

回答

1

我想了解中断如何与Thread.sleep()和Thread.join()一起工作。

这太复杂了,无法详细解释。这个实现主要是作为JVM代码库一部分的本地代码(即C++代码)以及由OS提供的本地线程支持等等。源代码可用,如果要阅读它。

正如我所见sleep()是一个静态方法,它如何检测中断是否发送到它被调用的线程?

静态方法委派给一个native方法,该方法实现sleep行为。该本地方法很可能会委托给操作系统提供的本地线程库(例如pthreads)来查找当前线程......如果有必要的话。 (这是>> < <在Linux情况下会发生什么。)

中断也在本地方法中处理。在Linux上,Java native sleep方法调用pthread_sleep。当后者返回时,native sleep方法调用pthread_interrupted以确定pthread_sleep调用是否被中断,并在必要时抛出Java异常。

“本地方法”是什么意思?

这些是未在Java代码中实现的方法。查看java.lang.Thread类的源代码,您将看到一些具有native修饰符的方法。这些是本地方法。