基于ajax实现在线网络工具之跳过线程

我在这篇文章中对这个小项目有过简单的介绍http://wzu-xiaomai.iteye.com/blog/1779814,你目前在看的这篇文章我主要想讲讲“线程的结束”。

在命令的执行时理想状态是执行后结果完全显示完再进行下一次命令的执行,但是对用户来说这样的体验不好,现实是用户想执行新命令了就停止旧命令结果的显示而显示新命令产生的结果。如果不对执行旧命令的线程进行处理,则保存命令结果的Queue队列内容会造成混乱(多次命令执行结果都放进去了)。

我在iteye问了一个问题http://www.iteye.com/problems/92188如何有效杀死一个线程?现在回过头来看这个问题,觉得自己问错了,不应该是杀死线程,而是跳过线程更合理。我在项目中跳过线程的策略跟那个问题的最佳答案原理差不多,都是设置一下标志位的值。只不过我的标志位不止一个,比如重复点执行就需要跳过旧线程,还有是用户关闭网页了,对一些持续有结果的线程就要在规定时间内结束,即停止结果放入Queue。

我在线程中的代码如下:

while ((line = input.readLine()) != null) {
                Date dateNow = new Date();
                time = dateNow.getTime() - date.getTime();
                minute = (time / (1000 * 60));
                id = (String) session.getAttribute("id");
                if (threadId == id && minute < MINUTE) {
                    results.offer(line);
                    session.setAttribute("result", results);
                }
                else {
                    break;
                }
            }
            results.offer("*end*");

每次点执行都会产生一个线程,我会给这个线程一个threadId,如果这个threadId是当前session域中的id则将结果放入队列中,否则说明用户又点了一次执行产生了一个新线程,那么旧线程的结果就不能放入队列中了,新线程的结果才可以。minute是用户关闭浏览器后到当前的时间,以分钟计。当minute > MINUTE时说明用户关闭浏览器大于5分钟了,还在运行的线程代码可以跳出来了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值