所谓的中断操作:它并不会真正地中断一个正在运行的线程,而只是发出中断请求,然后由线程在下一个合适的时刻中断自己。
调用一次interrupt中断请求,再次调用就是把中断状态恢复
1、响应中断
处理中断异常:
1》传递异常
立即学习“Java免费学习笔记(深入)”;
2088shop商城购物系统是商城系统中功能最全的一个版本:非会员购物、商品无限级分类、不限商品数量、商品多级会员定价、上货库存、Word在线编辑器、订单详情销售报表、商品评论、留言簿、管理员多级别、VIP积分、会员注册积分奖励、智能新闻发布、滚动公告、投票调查、背景图片颜色更换、店标上传、版权联系方式修改、背景音乐(好歌不断)、广告图片支持Flash、弹出浮动广告、搜索引擎关健词优化、图文友情联
2》恢复中断状态
这里有一个示例,用来限时运行任务,在规定的时间内,不论程序是否响应中断终止程序,还是没有响应到中断,我们都可以获取到通过调用这个方法获取结果,
也就是可以再规定的时间内获取到处理结果,对结果如何处理,那就可以自己定义
package cn.study.concurrency;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
*
* @author xiaof
*
*/
public class TimeCount {
private static final ScheduledExecutorService cancelExec = Executors.newSingleThreadScheduledExecutor();
/**
*
* @param r 线程
* @param timeout 任务超时限定
* @param unit 时间单元
* @throws Throwable
*/
public static void timedRun(final Runnable r, long timeout, TimeUnit unit) throws Throwable
{
class RethrowableTask implements Runnable
{
//抛出的异常
private volatile Throwable t;
@Override
public void run() {
try {
r.run();
} catch (Throwable e) {
this.t = e;
}
}
/**
* 当运行超时,或者程序运行正常退出的时候,后面进行控制的时候调用这个返回给调用者
* @throws Throwable
*/
void rethrow() throws Throwable
{
//这个t可以自己包装,或者返回其他数据,这个可以根据不同的业务来定
//这里甚至可以保持当前状态到本地,在下次运行的时候,先读取本地数据,恢复到当前状态,留到以后操作
if(t != null)
throw t;
}
}
RethrowableTask task = new RethrowableTask();
final Thread taskThread = new Thread(task);
taskThread.start(); //启动外部线程
cancelExec.schedule(new Runnable()
{
public void run()
{
//启动中断异常
taskThread.interrupt();
}
}, timeout, unit);
//等待线程的终止,用来应对即使任务不响应中断,限定时间一到,最后仍可以抛出异常到这个方法的调用者
taskThread.join(unit.toMillis(timeout));
//抛出异常
task.rethrow();
}
}









