java程序员-http://www.it-ebooks.info/

年轻的我,脚踩大地,仰望天空,路还很长....

博客园 首页 新随笔 联系 订阅 管理

0.CPU=处理器+控制器

1.cpu是一个资源的调度器,可以说是一个通过计算(要给处理设备的一些信息)进行任务调度,通过总线将任务交由其他的设备(IO或者网卡,显卡等处理)。

2.操作系统是多任务,其实对于单核CPU就是分时使用CPU。

3.进程就是内存中运行的程序(进程从软件上来说就是模拟一种硬件可以说是一种数据结构),运行完毕之后就切换出内存(这就是进程切换,花销比较大)CPU-内存-硬盘(速度越来越慢),电指令-机械指令,速度差别大了好几倍,线程仅仅是运行进程中的部分指令,处在内存中,切换代价小(CPU中执行或者等待--)就是寄存器到内存之间的切换,代价小。

4.计算机中断:为了使得计算机按照指定的指令执行(也就是按照指令的顺序就是串行执行),所以引入了中断机制,保证线程按照指令串行执行,同时可以和其他的设备进行通信,设备和CPU进行通信的方式就是采用中断机制进行,如果使用CPU只需发出中断指令即可。(大家可以理解一下轮询)。

5.切换:计算机中要保留现场信息,方便之后进行再次执行,所以有进程切换,线程切换。(切换要做额外的工作,所以耗时-相对的)。

6.计算机两种调度方式:协作式多任务(中断机制)--有点类似与事件机制 ,抢占式多任务(轮询机制),抢占式中断

注意:中断机制只是为了解决任务并发执行时可以安全的终止或者可以保证任务之间相互可以控制,这样管理对象可以对运行的任务或者命令进行控制,可以随意进行安全的停止。

===================================================================================================

java多线程中的中断机制:

1.线程都有一个interupt的状态位,表明当前线程中断的状态。

2.Thread.interrupt()作用:对于阻塞(低级别)的操作,触发解除阻塞,抛出异常,否则仅仅更新标志位。(线程的停止应该由线程自己来决定,而其他的线程如果想控制某一个线程,采用中断的方式--协作式机制,而非抢占机制,线程可以轮询中断标志位进行处理),主要作用就是解除阻塞或者取消任务。

3.LockSuport支持唤醒指定的线程,而notify唤醒某一类资源上的线程

====================================================================================================

volatile bool isInterrupted;//中断的标志位--由于是volatile,保证不同线程对此变量具有可见性--一致性

while(!isInterrupted) {//轮询检测是否是中断

doService();//如果进入循环则标识没有中断,执行业务方法

 }

public class Thread {
        //设置中断标记
        public void interrupt() { ... } 
        //获取中断标记的值
        public boolean isInterrupted() { ... }  ----------------检测中断
        //清除中断标记,并返回上一次中断标记的值
        public static boolean interrupted() { ... }     ----------------恢复中断状态(如何检测到中断之后,恢复中断的状态,然后处理,最后抛出Interruption)
        ...
 }

===================================================================================================

总计一下:

   需求场景中,多个线程处理任务,有些线程可能执行速度慢,这是其他线程可能取消这个执行慢的线程(可能阻塞或者执行但是执行的速度慢),所以我们可以发送中断指令

   就是把慢线程的标志位设为false,这样线程的工作就完成,至于慢线程如何响应,一般就是慢线程的任务里面在适合的时间点调用isInterrupted检测或者执行一些可以抛出

    Interruption的方法,这样方法的catch里面我们可以响应中断指令,我们处理然后抛出Interruption,这样慢线程的任务就被取消了

===================================================================================================   

 如果线程在等待获取一个内部锁,我们将无法中断它。但是,利用Lock类的lockInterruptibly方法,我们可以在等待锁的同时,提供中断能力。

上述三个方法比较重要。

====================================================================================================

posted on 2014-06-12 06:39  gstsyyb  阅读(529)  评论(0编辑  收藏  举报