我在这篇文章中对这个小项目有过简单的介绍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分钟了,还在运行的线程代码可以跳出来了。
?