나는 이미 Servlet Thread handling에 대한 위대한 기사를 읽었습니다.자바 서블릿 : 스레드를 인스턴스화하고 메시지를받는 방법
다음과 같은 문제가 있습니다. 첫 번째 버전의 임의의 메시지를 생성하는 새 스레드 또는 매개 변수에 따라 마지막 요청 이후 생성 된 모든 메시지와 함께 응답을 보내는 간단한 서블릿을 만들고 싶습니다. .
브라우저 사이트에서 JQuery AJAX 호출을 사용하여 처리 된 요청에 시간 초과가 발생했습니다.
수신자 호출을 실행하면 그 사이에 스레드가 충돌 한 이후로 생성 된 첫 번째 메시지 만 표시됩니다. 그것은 위에서 언급 한 기사에서 설명한 스레드 안전 문제가 될 것으로 보이지만 정확히 파악할 수 있습니다. 이건 내 현재 서블릿 코드
SEVERE: Exception in thread "Thread-75"
SEVERE: java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at com.lancom.lsr.util.RandomMessageProducer.run(RandomMessageProducer.java:35)
at java.lang.Thread.run(Thread.java:722)
SEVERE: at java.lang.Object.wait(Native Method)
SEVERE: at com.lancom.lsr.util.RandomMessageProducer.run(RandomMessageProducer.java:35)
SEVERE: at java.lang.Thread.run(Thread.java:722)
입니다
: 로그는 나에게 다음과 같은 정보를 제공public class MyServlet extends HttpServlet {
...
private RandomMessageProducer rmProducer;
private Thread rmpThread;
...
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<Integer, String> msg = new HashMap<Integer, String>();
Gson gson = new Gson();
String sDevs = request.getParameter("devices"); // Option 1
String sGetMsg = request.getParameter("rec_msg"); // Option 2
PrintWriter pw = response.getWriter();
// Request: Send information and run thread
if (sDevs != null && STATUS==0) {
/* Start a dummy producer */
rmProducer = new RandomMessageProducer();
rmpThread = new Thread(rmProducer)
rmpThread.start();
pw.print("{\"1\": \"Action started!\"}");
STATUS=1;
}
// Request: Receive messages
else if (sGetMsg != null) {
List<String> logs = rmProducer.getLogMsg();
for (String lmsg : logs) {
// Check if we can update the current Status
if (msg.equals("<<<FIN_SUCC>>>") || msg.equals("<<<FIN_ERR>>>")) {
STATUS=0;
}
msg.put(0, lmsg);
}
String json = gson.toJson(msg);
pw.print(json);
}
pw.close();
}
}
을 그리고 이것은 내 간단한 메시지 생산자 스레드 :
public class RandomMessageProducer implements Runnable {
private Queue<String> msgQueue = new LinkedList<String>();
@Override
public void run() {
Random randomGenerator = new Random();
for (int idx = 1; idx <= 100; ++idx){
int randomInt = randomGenerator.nextInt(100);
msgQueue.add("Generated : " + randomInt);
try {
wait(500);
} catch (InterruptedException e) {
msgQueue.add("<<<FIN_ERR>>>");
e.printStackTrace();
}
}
msgQueue.add("<<<FIN_SUCC>>>");
}
public List<String> getLogMsg() {
List<String> res = new ArrayList<String>();
while (!msgQueue.isEmpty()) {
res.add(msgQueue.poll());
}
return res;
}
}
요청은 모두 수행 1000ms
당신은 아마 추론에서 내 오류를 볼 수 있습니까?
고맙습니다.
를 사용 shuld 값을 수정하려면 어떻게 RandomMessageProducer의 35 번째 줄입니까? – Elior