zthread学习 实例九 任务终止(二)——中断方式

来源:互联网 发布:js函数有返回值吗 编辑:程序博客网 时间:2024/05/17 23:42

 

引起线程变为阻塞状态的原因有:

1、调用了sleep(),线程进入休眠状态。

2、调用了wait(),挂起了线程的运行。

3、线程正在等待某个I/0操作完成(此时中断是不会出现的)。

4、线程在尝试进入一段被一个互斥锁保护的代码块,而那个互斥锁已经被其他线程获得。

 


终止一个阻塞线程和终止一个非阻塞线程的方式有很大的不同。

 

终止一个阻塞线程 通常 的做法是,首先唤醒它,然后按终止一个非阻塞线程的方式来终止,但这样线程会多执行了一些代码。

 

有时需要在某个线程处于阻塞状态时 立即 终止它。ZThread库使用抛异常的方式来解决立即终止 阻塞 线程。因为从被阻塞的任务中离开时,可能需要销毁与之相关的对象并清理有关资源,正因为这样在run()中间跳出更像是抛出一个异常。在run()函数包含try模块,在响应异常的catch语句中清理有关资源。

 

interrupt()函数用来给线程设置中断状态,一个使用了中断状态设置的线程,如果已经被阻塞或尝试进行阻塞时将会抛出一个Interrupted_Exception异常。当异常被抛出或调用了intertupted()时,中断状态重新被设置。

 

中断状态可以通过调用interrupt()进行设置。调用interrupted()来检查中断状态(不仅能告知interrupt()是否被调用,还会清除当前的中断状态,以确保不会两次通知正被中断的任务),interrupted()会用一个Interrupted_Exception异常来通知一个已经阻塞的线程,或用一个成功的返回值来通知一个非阻塞的线程。下面例子显示了当设置中断状态时,run()函数中处理阻塞和非阻塞两种可能性的情况:

 

为了保证不因退出而出现不一致的状态,所有资源获取都应封装在基于的对象中,以便无论run()如何退出,对象的析构都会被调用。

 

原创粉丝点击