<strong><span style="font-size:14px;"></span></strong><p style="margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: 20.8px;"><span style="line-height: 20.8px; background-color: rgb(255, 255, 255);"><strong><span style="font-size:14px;">一、统计当前在线人数</span></strong></span></p>
1 package me.gacl.web.listener;
2
3 import javax.servlet.ServletContext;
4 import javax.servlet.http.HttpSessionEvent;
5 import javax.servlet.http.HttpSessionListener;
6
7 /**
8 * @ClassName: OnLineCountListener
9 * @Description: 统计当前在线用户个数
10 * @anthor: 阶段丶成长
11 * @date: 2014-9-10 下午10:01:26
12 *
13 */
14 public class OnLineCountListener implements HttpSessionListener {
15
16 @Override
17 public void sessionCreated(HttpSessionEvent se) {
18 ServletContext context = se.getSession().getServletContext();
19 Integer onLineCount = (Integer) context.getAttribute("onLineCount");
20 if(onLineCount==null){
21 context.setAttribute("onLineCount", 1);
22 }else{
23 onLineCount++;
24 context.setAttribute("onLineCount", onLineCount);
25 }
26 }
27
28 @Override
29 public void sessionDestroyed(HttpSessionEvent se) {
30 ServletContext context = se.getSession().getServletContext();
31 Integer onLineCount = (Integer) context.getAttribute("onLineCount");
32 if(onLineCount==null){
33 context.setAttribute("onLineCount", 1);
34 }else{
35 onLineCount--;
36 context.setAttribute("onLineCount", onLineCount);
37 }
38 }
39 }
二、自定义Session扫描器
<strong><span style="font-size:14px;"> </span></strong><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; line-height: 20.8px; font-family: 'Courier New' !important;"><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">1</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">package</span><span style="line-height: 1.5 !important;"> me.gacl.web.listener;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 2</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 3</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">import</span><span style="line-height: 1.5 !important;"> java.util.Collections;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 4</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">import</span><span style="line-height: 1.5 !important;"> java.util.LinkedList;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 5</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">import</span><span style="line-height: 1.5 !important;"> java.util.List;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 6</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">import</span><span style="line-height: 1.5 !important;"> java.util.ListIterator;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 7</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">import</span><span style="line-height: 1.5 !important;"> java.util.Timer;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 8</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">import</span><span style="line-height: 1.5 !important;"> java.util.TimerTask;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 9</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">import</span><span style="line-height: 1.5 !important;"> javax.servlet.ServletContextEvent;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 10</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">import</span><span style="line-height: 1.5 !important;"> javax.servlet.ServletContextListener;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 11</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">import</span><span style="line-height: 1.5 !important;"> javax.servlet.http.HttpSession;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 12</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">import</span><span style="line-height: 1.5 !important;"> javax.servlet.http.HttpSessionEvent;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 13</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">import</span><span style="line-height: 1.5 !important;"> javax.servlet.http.HttpSessionListener;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 14</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 15</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">/**</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 16</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">* @ClassName: SessionScanerListener
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 17</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">* @Description: 自定义session扫描器
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 18</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">* </span><span style="color: rgb(128, 128, 128); line-height: 1.5 !important;">@author</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">:阶段丶成长
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 19</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">* @date: 2014-9-10 下午10:16:42
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 20</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">*
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 21</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">*/</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 22</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">public</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">class</span> SessionScanerListener <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">implements</span><span style="line-height: 1.5 !important;"> HttpSessionListener,ServletContextListener {
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 23</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 24</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">/**</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 25</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * @Field: list
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 26</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 定义一个集合存储服务器创建的HttpSession
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 27</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * LinkedList不是一个线程安全的集合
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 28</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">*/</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 29</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">/**</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 30</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * private List<HttpSession> list = new LinkedList<HttpSession>();
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 31</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 这样写涉及到线程安全问题,SessionScanerListener对象在内存中只有一个
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 32</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * sessionCreated可能会被多个人同时调用,
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 33</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 当有多个人并发访问站点时,服务器同时为这些并发访问的人创建session
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 34</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 那么sessionCreated方法在某一时刻内会被几个线程同时调用,几个线程并发调用sessionCreated方法
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 35</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * sessionCreated方法的内部处理是往一个集合中添加创建好的session,那么在加session的时候就会
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 36</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 涉及到几个Session同时抢夺集合中一个位置的情况,所以往集合中添加session时,一定要保证集合是线程安全的才行
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 37</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 如何把一个集合做成线程安全的集合呢?
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 38</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 可以使用使用 Collections.synchronizedList(List<T> list)方法将不是线程安全的list集合包装线程安全的list集合
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 39</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">*/</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 40</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">//</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">使用 Collections.synchronizedList(List<T> list)方法将LinkedList包装成一个线程安全的集合</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 41</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">private</span> List<HttpSession> list = Collections.synchronizedList(<span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">new</span> LinkedList<HttpSession><span style="line-height: 1.5 !important;">());
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 42</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">//</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">定义一个对象,让这个对象充当一把锁,用这把锁来保证往list集合添加的新的session和遍历list集合中的session这两个操作达到同步</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 43</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">private</span> Object lock = <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">new</span><span style="line-height: 1.5 !important;"> Object();
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 44</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 45</span> <span style="line-height: 1.5 !important;"> @Override
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 46</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">public</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">void</span><span style="line-height: 1.5 !important;"> sessionCreated(HttpSessionEvent se) {
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 47</span> System.out.println("session被创建了!!"<span style="line-height: 1.5 !important;">);
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 48</span> HttpSession session =<span style="line-height: 1.5 !important;"> se.getSession();
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 49</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 50</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">synchronized</span><span style="line-height: 1.5 !important;"> (lock){
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 51</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">/**</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 52</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> *将该操作加锁进行锁定,当有一个thread-1(线程1)在调用这段代码时,会先拿到lock这把锁,然后往集合中添加session,
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 53</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> *在添加session的这个过程中假设有另外一个thread-2(线程2)来访问了,thread-2可能是执行定时器任务的,
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 54</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> *当thread-2要调用run方法遍历list集合中的session时,结果发现遍历list集合中的session的那段代码被锁住了,
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 55</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> *而这把锁正在被往集合中添加session的那个thread-1占用着,因此thread-2只能等待thread-1操作完成之后才能够进行操作
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 56</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> *当thread-1添加完session之后,就把lock放开了,此时thread-2拿到lock,就可以执行遍历list集合中的session的那段代码了
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 57</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> *通过这把锁就保证了往集合中添加session和变量集合中的session这两步操作不能同时进行,必须按照先来后到的顺序来进行。
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 58</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">*/</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 59</span> <span style="line-height: 1.5 !important;"> list.add(session);
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 60</span> <span style="line-height: 1.5 !important;"> }
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 61</span> <span style="line-height: 1.5 !important;"> }
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 62</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 63</span> <span style="line-height: 1.5 !important;"> @Override
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 64</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">public</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">void</span><span style="line-height: 1.5 !important;"> sessionDestroyed(HttpSessionEvent se) {
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 65</span> System.out.println("session被销毁了了!!"<span style="line-height: 1.5 !important;">);
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 66</span> <span style="line-height: 1.5 !important;"> }
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 67</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 68</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">/*</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> Web应用启动时触发这个事件
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 69</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 70</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">*/</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 71</span> <span style="line-height: 1.5 !important;"> @Override
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 72</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">public</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">void</span><span style="line-height: 1.5 !important;"> contextInitialized(ServletContextEvent sce) {
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 73</span> System.out.println("web应用初始化"<span style="line-height: 1.5 !important;">);
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 74</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">//</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">创建定时器</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 75</span> Timer timer = <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">new</span><span style="line-height: 1.5 !important;"> Timer();
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 76</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">//</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">每隔30秒就定时执行任务</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 77</span> timer.schedule(<span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">new</span> MyTask(list,lock), 0, 1000*30<span style="line-height: 1.5 !important;">);
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 78</span> <span style="line-height: 1.5 !important;"> }
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 79</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 80</span> <span style="line-height: 1.5 !important;"> @Override
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 81</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">public</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">void</span><span style="line-height: 1.5 !important;"> contextDestroyed(ServletContextEvent sce) {
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 82</span> System.out.println("web应用关闭"<span style="line-height: 1.5 !important;">);
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 83</span> <span style="line-height: 1.5 !important;"> }
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 84</span> <span style="line-height: 1.5 !important;">}
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 85</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 86</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">/**</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 87</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">* @ClassName: MyTask
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 88</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">* @Description:定时器要定时执行的任务
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 89</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">* </span><span style="color: rgb(128, 128, 128); line-height: 1.5 !important;">@author</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">: 孤傲苍狼
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 90</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">* @date: 2014-9-11 上午12:02:36
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 91</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">*
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 92</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">*/</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 93</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">class</span> MyTask <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">extends</span><span style="line-height: 1.5 !important;"> TimerTask {
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 94</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 95</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">//</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">存储HttpSession的list集合</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 96</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">private</span> List<HttpSession><span style="line-height: 1.5 !important;"> list;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 97</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">//</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">存储传递过来的锁</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 98</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">private</span><span style="line-height: 1.5 !important;"> Object lock;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;"> 99</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">public</span> MyTask(List<HttpSession><span style="line-height: 1.5 !important;"> list,Object lock){
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">100</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">this</span>.list =<span style="line-height: 1.5 !important;"> list;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">101</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">this</span>.lock =<span style="line-height: 1.5 !important;"> lock;
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">102</span> <span style="line-height: 1.5 !important;"> }
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">103</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">/*</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> run方法指明了任务要做的事情
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">104</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * @see java.util.TimerTask#run()
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">105</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">*/</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">106</span> <span style="line-height: 1.5 !important;"> @Override
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">107</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">public</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">void</span><span style="line-height: 1.5 !important;"> run() {
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">108</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">//</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">将该操作加锁进行锁定</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">109</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">synchronized</span><span style="line-height: 1.5 !important;"> (lock) {
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">110</span> System.out.println("定时器执行!!"<span style="line-height: 1.5 !important;">);
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">111</span> ListIterator<HttpSession> it =<span style="line-height: 1.5 !important;"> list.listIterator();
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">112</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">/**</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">113</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 迭代list集合中的session,在迭代list集合中的session的过程中可能有别的用户来访问,
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">114</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 用户一访问,服务器就会为该用户创建一个session,此时就会调用sessionCreated往list集合中添加新的session,
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">115</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 然而定时器在定时执行扫描遍历list集合中的session时是无法知道正在遍历的list集合又添加的新的session进来了,
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">116</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 这样就导致了往list集合添加的新的session和遍历list集合中的session这两个操作无法达到同步
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">117</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 那么解决的办法就是把"list.add(session)和while(it.hasNext()){//迭代list集合}"这两段代码做成同步,
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">118</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 保证当有一个线程在访问"list.add(session)"这段代码时,另一个线程就不能访问"while(it.hasNext()){//迭代list集合}"这段代码
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">119</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 为了能够将这两段不相干的代码做成同步,只能定义一把锁(Object lock),然后给这两步操作加上同一把锁,
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">120</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 用这把锁来保证往list集合添加的新的session和遍历list集合中的session这两个操作达到同步
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">121</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 当在执行往list集合添加的新的session操作时,就必须等添加完成之后才能够对list集合进行迭代操作,
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">122</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 当在执行对list集合进行迭代操作时,那么必须等到迭代操作结束之后才能够往往list集合添加的新的session
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">123</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">*/</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">124</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">while</span><span style="line-height: 1.5 !important;">(it.hasNext()){
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">125</span> HttpSession session =<span style="line-height: 1.5 !important;"> (HttpSession) it.next();
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">126</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">/**</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">127</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * 如果当前时间-session的最后访问时间>1000*15(15秒)
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">128</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;"> * session.getLastAccessedTime()获取session的最后访问时间
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">129</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">*/</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">130</span> <span style="color: rgb(0, 0, 255); line-height: 1.5 !important;">if</span>(System.currentTimeMillis()-session.getLastAccessedTime()>1000*30<span style="line-height: 1.5 !important;">){
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">131</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">//</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">手动销毁session</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">132</span> <span style="line-height: 1.5 !important;"> session.invalidate();
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">133</span> <span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">//</span><span style="color: rgb(0, 128, 0); line-height: 1.5 !important;">移除集合中已经被销毁的session</span>
<span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">134</span> <span style="line-height: 1.5 !important;"> it.remove();
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">135</span> <span style="line-height: 1.5 !important;"> }
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">136</span> <span style="line-height: 1.5 !important;"> }
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">137</span> <span style="line-height: 1.5 !important;"> }
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">138</span> <span style="line-height: 1.5 !important;"> }
</span><span style="color: rgb(0, 128, 128); line-height: 1.5 !important;">139</span> }