Skip to content

Commit a116de3

Browse files
committed
Use ArrayBlockingQueue to instead of ConcurrentLinkedQueue.
1 parent a0c633d commit a116de3

File tree

2 files changed

+30
-32
lines changed

2 files changed

+30
-32
lines changed

src/tinystruct/examples/smalltalk.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.Date;
1515
import java.util.List;
1616
import java.util.Queue;
17+
import java.util.concurrent.ArrayBlockingQueue;
1718
import java.util.concurrent.ConcurrentLinkedQueue;
1819

1920
import javax.servlet.ServletException;
@@ -61,26 +62,21 @@ public talk index() {
6162
}
6263

6364
List<String> session_ids;
64-
synchronized (this.meetings) {
65-
final String sessionId = request.getSession().getId();
66-
if (this.meetings.get(meetingCode) == null) {
67-
this.meetings.put(meetingCode.toString(), new ConcurrentLinkedQueue<Builder>());
68-
}
69-
70-
// If the current user is not in the list of the sessions, we create a default session list for the meeting generated.
71-
if((session_ids = this.sessions.get(meetingCode)) == null)
72-
{
73-
this.sessions.put(meetingCode.toString(), session_ids = new ArrayList<String>());
74-
}
75-
76-
if(!session_ids.contains(sessionId))
77-
session_ids.add(sessionId);
65+
final String sessionId = request.getSession().getId();
66+
if (this.meetings.get(meetingCode) == null) {
67+
this.meetings.put(meetingCode.toString(), new ArrayBlockingQueue<Builder>(DEFAULT_MESSAGE_POOL_SIZE));
68+
}
7869

79-
this.meetings.notifyAll();
70+
// If the current user is not in the list of the sessions, we create a default session list for the meeting generated.
71+
if((session_ids = this.sessions.get(meetingCode)) == null)
72+
{
73+
this.sessions.put(meetingCode.toString(), session_ids = new ArrayList<String>());
8074
}
75+
76+
if(!session_ids.contains(sessionId))
77+
session_ids.add(sessionId);
8178

8279
synchronized (this.list) {
83-
final String sessionId = request.getSession().getId();
8480
if(!this.list.containsKey(sessionId))
8581
{
8682
this.list.put(sessionId, new ConcurrentLinkedQueue<Builder>());

src/tinystruct/examples/talk.java

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import java.util.Map;
1111
import java.util.Map.Entry;
1212
import java.util.Queue;
13+
import java.util.concurrent.ArrayBlockingQueue;
14+
import java.util.concurrent.BlockingQueue;
1315
import java.util.concurrent.ConcurrentHashMap;
1416
import java.util.concurrent.ConcurrentLinkedQueue;
1517
import java.util.concurrent.ExecutorService;
@@ -23,10 +25,11 @@
2325

2426
public class talk extends AbstractApplication {
2527

26-
private static final long TIMEOUT = 200;
28+
private static final long TIMEOUT = 10;
2729
private static final int DEFAULT_POOL_SIZE = 3;
30+
protected static final int DEFAULT_MESSAGE_POOL_SIZE = 10;
31+
protected final Map<String, BlockingQueue<Builder>> meetings = new ConcurrentHashMap<String, BlockingQueue<Builder>>();
2832
protected final Map<String, Queue<Builder>> list = new ConcurrentHashMap<String, Queue<Builder>>();
29-
protected final Map<String, Queue<Builder>> meetings = new ConcurrentHashMap<String, Queue<Builder>>();
3033
protected final Map<String, List<String>> sessions = new ConcurrentHashMap<String, List<String>>();
3134
private ExecutorService service;
3235

@@ -89,39 +92,38 @@ public String save(Object meetingCode, String sessionId, String message) {
8992
* @return builder
9093
*/
9194
public final String save(final Object meetingCode, final Builder builder) {
92-
final Queue<Builder> messages;
93-
synchronized (this.meetings) {
94-
if (this.meetings.get(meetingCode) == null) {
95-
this.meetings.put(meetingCode.toString(), new ConcurrentLinkedQueue<Builder>());
96-
}
95+
BlockingQueue<Builder> messages;
96+
if ((messages = this.meetings.get(meetingCode)) == null) {
97+
messages = new ArrayBlockingQueue<Builder>(DEFAULT_MESSAGE_POOL_SIZE);
98+
this.meetings.put(meetingCode.toString(), messages);
99+
}
97100

98-
messages = this.meetings.get(meetingCode);
99-
messages.add(builder);
100-
this.meetings.notifyAll();
101+
try {
102+
messages.put(builder);
103+
} catch (InterruptedException e) {
104+
e.printStackTrace();
101105
}
102106

103107
this.getService().execute(new Runnable(){
104108
@Override
105109
public void run() {
106-
synchronized(talk.this.meetings) {
107110
Builder message;
108111
do {
109112
try {
110-
talk.this.meetings.wait(TIMEOUT);
113+
Thread.sleep(TIMEOUT);
111114
} catch (InterruptedException e) {
112-
e.printStackTrace();
115+
e.printStackTrace();
113116
}
114117
} while(talk.this.meetings.get(meetingCode) == null || (message = talk.this.meetings.get(meetingCode).poll()) == null);
115118

116119
talk.this.copy(meetingCode, message);
117-
}
118120
}
119121
});
120122
return builder.toString();
121123
}
122124

123125
private ExecutorService getService() {
124-
return this.service!=null? this.service : Executors.newFixedThreadPool(DEFAULT_POOL_SIZE);
126+
return this.service!=null? this.service : Executors.newFixedThreadPool(DEFAULT_POOL_SIZE);
125127
}
126128

127129
/**
@@ -195,7 +197,7 @@ public String version() {
195197
* @throws ApplicationException
196198
*/
197199
public boolean testing(final int n) throws ApplicationException {
198-
this.meetings.put("[M001]", new ConcurrentLinkedQueue<Builder>());
200+
this.meetings.put("[M001]", new ArrayBlockingQueue<Builder>(DEFAULT_MESSAGE_POOL_SIZE));
199201
this.list.put("{A}", new ConcurrentLinkedQueue<Builder>());
200202
this.list.put("{B}", new ConcurrentLinkedQueue<Builder>());
201203

0 commit comments

Comments
 (0)