b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

afford?extra?Thread的中断机制(interrupt)(4)

电脑杂谈  发布时间:2016-11-06 13:02:57  来源:网络整理

二、对于处于sleep,join等操作的线程,如果被调用interrupt()后,会抛出interruptedException,然后线程的中断标志位会由true重置为false,因为线程为了处理异常已经重新处于就绪状态。

三、不可中断的操作,包括进入synchronized段以及Lock.lock(),inputSteam.read()等,调用interrupt()对于这几个问题无效,因为它们都不抛出中断异常。如果拿不到资源,它们会无限期阻塞下去。

对于Lock.lock(),可以改用Lock.lockinterruptibly(),可被中断的加锁操作,它可以抛出中断异常。等同于等待时间无限长的Lock.tryLock(long time,TimeUnit unit)。

对于inputStream等资源,有些(实现了interruptibleChannel接口)可以通过close()方法将资源关闭,对应的阻塞也会被放开。

首先,看看Thread类里的几个方法:

public static booleaninterrupted 测试当前线程是否已经中断。线程的中断状态由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false。

public booleanisinterrupted()

测试线程是否已经中断。线程的中断状态不受该方法的影响。

public voidinterrupt()

中断线程。

上面列出了与中断有关的几个方法及其行为,可以看到interrupt是中断线程。如果不了解Java的中断机制,这样的一种解释极容易造成误解,认为调用了线程的interrupt方法就一定会中断线程。
其实,Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己。每个线程都有一个boolean的中断状态(这个状态不在Thread的属性上),interrupt方法仅仅只是将该状态置为true。

比如对正常运行的线程调用interrupt()并不能终止他,只是改变了interrupt标示符。

一般说来,如果一个方法声明抛出InterruptedException,表示该方法是可中断的,比如wait,sleep,join,也就是说可中断方法会对interrupt调用做出响应(例如sleep响应interrupt的操作包括清除中断状态,抛出InterruptedException),异常都是由可中断方法自己抛出来的,并不是直接由interrupt方法直接引起的。

Object.wait, Thread.sleep方法,会不断的轮询 interrupted 标志位,发现其设置为true后,会停止阻塞并抛出 interruptedException异常。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

看了以上的说明,对java中断的使用肯定是会了,但我想知道的是阻塞了的线程是如何通过interuppt方法完成停止阻塞并抛出interruptedException的,这就要看Thread中native的interuppt0方法了。

第一步学习Java的JNI调用Native方法。

第二步下载openjdk的源代码,找到目录结构里的openjdk-src\jdk\src\share\native\java\lang\Thread.c文件。

#include #include #include THD "Ljava/lang/Thread;" #define OBJ "Ljava/lang/Object;" #define STE "Ljava/lang/StackTraceElement;" #define ARRAY_LENGTH(a) (sizeof(a)/sizeof(a[0])) static JNINativeMethod methods[] = { {, , (void *)&JVM_StartThread}, {, OBJ , (void *)&JVM_StopThread}, {, , (void *)&JVM_IsThreadAlive}, {, , (void *)&JVM_SuspendThread}, {, , (void *)&JVM_ResumeThread}, {, , (void *)&JVM_SetThreadPriority}, {, , (void *)&JVM_Yield}, {, , (void *)&JVM_Sleep}, {, THD, (void *)&JVM_CurrentThread}, {, , (void *)&JVM_CountStackFrames}, {, , (void *)&JVM_Isinterrupted}, {, OBJ , (void *)&JVM_HoldsLock}, {, THD, (void *)&JVM_GetAllThreads}, {, THD STE, (void *)&JVM_DumpThreads}, }; #undef THD #undef OBJ #undef STE JNIEXPORT void JNICALL Java_java_lang_Thread_registerNatives(JNIEnv *env, jclass cls) { (*env)->RegisterNatives(env, cls, methods, ARRAY_LENGTH(methods)); }

暂时还看不太懂,先去学习一下C的一些基础。

未完待续...

以上就是关于interrupt的全部内容,相信你一定会非常满意。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-20282-4.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...