监听器(Listener)在开发中的应用

<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> }
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值