Skip to content

Commit faeebac

Browse files
committed
守护线程的案例
1 parent a718948 commit faeebac

File tree

4 files changed

+136
-0
lines changed

4 files changed

+136
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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+
}

0 commit comments

Comments
 (0)