前些时期,学习过线程阻塞,唤醒,时钟中断的一些知识,主要是从linux内核书籍中获取(资料在HttpClient技术基础之超时和keepalive.zip ),今天思考了一下,觉得应该猜测Java的interrupt和sleep做了什么。
interrupt():
(1) 将线程的中断状态设置为true;
this.interrupted = true; //模拟
(2) 如果线程正好处于阻塞状态,则唤醒它;
if( 线程正处于阻塞状态,即thread->state == TASK_INTERRUPTIBLE ){ thread->state == TASK_RUNNING;//则唤醒 reschedule_Idle(); }
---------------------------------------------------------------------------------------------------------------------------------
sleep(timeout):
(1) 首先检查线程的中断状态,如果为true,就直接抛出InterruptedException
if(this.interrupted == true){ //模拟 this.interrupted == false; throw new InterruptedException(); };
(2) 设置时钟中断处理程序:timeout时间后,定时器发出时钟中断,CPU执行时钟中断处理程序。
设置时钟中断处理程序: currentThread->state == TASK_RUNNING; reschedule_Idle();
(3) 将自己挂起。
thread->state == TASK_INTERRUPTIBLE; schedule();
(4) 醒过来了... 看看情况:
如果是被时钟唤醒,则返回;
如果不是被时钟唤醒,而不是被中断程序唤醒,则设置中断状态设置为false,并抛出InterruptedException
if(this.interrupted == true){ //(模拟)是被中断唤醒,抛出异常 this.interrupted == false; throw new InterruptedException(); }; //否则,则是时钟timeout了,时钟中断处理程序唤醒了我,那没事,正常返回