File tree Expand file tree Collapse file tree 4 files changed +136
-0
lines changed
src/org/javacore/thread/daemon Expand file tree Collapse file tree 4 files changed +136
-0
lines changed 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