File tree Expand file tree Collapse file tree
src/org/javacore/thread/daemon Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ package org .javacore .thread .daemon ;
2+
3+ import java .util .Date ;
4+ import java .util .Deque ;
5+
6+ /**
7+ * 描述:管理这个队列,如果事件超过10秒钟,就会被移除
8+ * Created by bysocket on 16/3/4.
9+ */
10+ public class CleanerTask extends Thread {
11+ private Deque <Event > deque ;
12+
13+ public CleanerTask (Deque <Event > deque ) {
14+ this .deque = deque ;
15+ setDaemon (true );
16+ }
17+
18+ @ Override
19+ public void run () {
20+ while (true ) {
21+ Date date = new Date ();
22+ clean (date );
23+ }
24+ }
25+
26+ /**
27+ * 删除该时间前10s内创建的事件对象
28+ * @param date
29+ */
30+ private void clean (Date date ) {
31+ long difference = 0 ;
32+ boolean delete ;
33+ if (deque .size () == 0 ) {
34+ return ;
35+ }
36+ delete = false ;
37+
38+ do {
39+ Event e = deque .getLast ();
40+ difference = date .getTime () - e .getDate ().getTime ();
41+ if (difference > 10000 ) {
42+ System .out .printf ("Cleaner: %s \n " ,e .getEvent ());
43+ deque .removeLast ();
44+ delete = true ;
45+ }
46+ } while (difference > 10000 );
47+
48+ if (delete ) {
49+ System .out .printf ("Cleaner: Size of the queue: %d\n " ,deque .size ());
50+ }
51+ }
52+ }
Original file line number Diff line number Diff line change 1+ package org .javacore .thread .daemon ;
2+
3+ import java .util .ArrayDeque ;
4+ import java .util .Deque ;
5+
6+ /**
7+ * 1. 知道3个WriteTask线程休眠后,CleanerTask才执行
8+ * 2. 从结果中,可以看出队列维持在一定数量当中
9+ * Created by bysocket on 16/3/4.
10+ */
11+ public class DaemonTest {
12+ public static void main (String [] args ) {
13+ Deque <Event > deque = new ArrayDeque <>();
14+ WriterTask writerTask = new WriterTask (deque );
15+ for (int i = 0 ; i < 3 ; i ++) {
16+ Thread thread = new Thread (writerTask );
17+ thread .start ();
18+ }
19+
20+ CleanerTask cleanerTask = new CleanerTask (deque );
21+ cleanerTask .start ();
22+ }
23+ }
Original file line number Diff line number Diff line change 1+ package org .javacore .thread .daemon ;
2+
3+ import java .util .Date ;
4+
5+ /**
6+ * 描述:事件类
7+ * Created by bysocket on 16/3/4.
8+ */
9+ public class Event {
10+ private Date date ;
11+ private String event ;
12+
13+ public Date getDate () {
14+ return date ;
15+ }
16+
17+ public void setDate (Date date ) {
18+ this .date = date ;
19+ }
20+
21+ public String getEvent () {
22+ return event ;
23+ }
24+
25+ public void setEvent (String event ) {
26+ this .event = event ;
27+ }
28+ }
Original file line number Diff line number Diff line change 1+ package org .javacore .thread .daemon ;
2+
3+ import java .util .Date ;
4+ import java .util .Deque ;
5+ import java .util .concurrent .TimeUnit ;
6+
7+ /**
8+ * 描述:写事件到一个队列
9+ * Created by bysocket on 16/3/4.
10+ */
11+ public class WriterTask implements Runnable {
12+ private Deque <Event > deque ;
13+
14+ public WriterTask (Deque <Event > deque ) {
15+ this .deque = deque ;
16+ }
17+
18+ @ Override
19+ public void run () {
20+ for (int i = 1 ; i < 100 ; i ++) {
21+ Event event = new Event ();
22+ event .setDate (new Date ());
23+ event .setEvent (String .format ("The thread %s has generated an event" ,Thread .currentThread ().getId ()));
24+ deque .addFirst (event );
25+
26+ try {
27+ TimeUnit .SECONDS .sleep (1 );
28+ } catch (InterruptedException e ) {
29+ e .printStackTrace ();
30+ }
31+ }
32+ }
33+ }
You can’t perform that action at this time.
0 commit comments