2013-03-06 7 views
1
public void contextInitialized(final ServletContextEvent event) { 
    try { 
     System.out.println("start thread"); 
     Thread thread = new Thread(new SerialReader(event, serialPort,mode)); 
     thread.start(); 
    } catch (Exception e1) { 
     e1.printStackTrace(); 
    } 

    System.out.println("thread engaged"); 
} 

이 코드를 실행하는 동안 오류가 없습니다. "thread engaged"는 절대로 인쇄되지 않습니다. 메인 스레드가 계속 실행되는 것을 막을 수있는 것은 무엇입니까?메인 스레드가 멈 춥니 다?

나는 완벽하게 작동

  Thread thread = new Thread(new Runnable(){ 
       public void run(){ 
        try { 
         Thread.sleep(1000); 
         System.out.println("OUTPUT"); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       }; 


      }); 

로 교체하여이 문제를 테스트했습니다.

편집 : 생성자에서 일어나고있는 유일한입니다

private BlockingQueue<String> queue = new LinkedBlockingQueue<String>(); 
public SerialReader(ServletContextEvent event, String port, int mode) throws Exception { 
    if (mode==1){ 
    System.out.println("**Mode 1**"); 
    } else {//mode is 1 
    } 
    event.getServletContext().setAttribute("serialPortData", queue); 
} 

EDIT2 : (서블릿 컨텍스트 리스너)이 무엇

private static final String SHUTDOWN_REQ = "SHUTDOWN"; 
    public void attributeAdded(ServletContextAttributeEvent event) { 

     queue = (BlockingQueue<String>) event.getServletContext().getAttribute("serialPortData"); 

     //we always get a null here on first try that's why I added null check 
     if (queue == null){ 
      System.out.println("Queue is empty"); 
     } else { 
      String item; 
      try { 
       //blocks while queue is empty 
       while ((item = queue.take()) != SHUTDOWN_REQ) { 
        System.out.println("*******WEB*******"+item+"*******"); 
        //TODO Broadcast message to connected clients 
       } 
      } catch (InterruptedException e) { 
       System.out.println("queue error"); 
       //e.printStackTrace(); 
      } 
     }  
    } 
+4

'new SerialReader (event, serialPort, mode) ' – assylias

+0

미안하지만 무슨 뜻인지 이해가 안 되니? – Thomas

+1

아마도 이것이 실행이 멈춘 곳일 것입니다 ('SerialReader'의 생성자에서). – assylias

답변

3

입니다. 이 표현 : 새로운 SerialReader를 만들 수

new SerialReader(event, serialPort,mode); 

요청하지만, 생성자에서이 작업을 수행 : eventServletContextEvent입니다

private BlockingQueue<String> queue = new LinkedBlockingQueue<String>(); 
event.getServletContext().setAttribute("serialPortData", queue); 

. setAttribute을 호출하면 서블릿 컨텍스트의 모든 속성 수신기에 대한 알림이 트리거됩니다. 이 코드로 구성된 이러한 청취자가 :

else { 
    try { 
     //blocks while queue is empty 
     while ((item = queue.take()) != SHUTDOWN_REQ) 

을하지만이 코드가 실행될 때 지속적으로에서 항목을 얻을 수있는 큐를 폴링 귀하의 큐는 호출 스레드에, 널 (null)이 아닙니다. 왜 당신의 생성자는 결코 반환하지 않습니다.

나는 당신이 리스너를 통해 달성하려는 것을 100 % 확신 해요,하지만 당신은 아마 당신이 지금 외부 방식에 반대, 그것의 내부 스레드 를 보내는 메시지를 생성하고 싶습니다.

+0

Thx, 예, 그런 일이 일어나고 있습니다. 직렬 포트에서 수신기로 데이터를 보내려하고 있습니다 (그리고 대기 프레임 워크를 사용하여 연결된 모든 클라이언트에 브로드 캐스팅). "외부에서 대신 리스너 내부로 메시지를 보내는 메시지를 생성 하시겠습니까?" – Thomas

+0

그래서 차단 부분을 새 스레드에 넣을 것입니다. 나는 지금 그것을 시험 할 것이다. Thx – Thomas

+0

@ThomasV. - 네, 그게 무슨 뜻인지. – Perception

1

:

(item = queue.take()) != SHUTDOWN_REQ 

왜 안

!(item = queue.take()).equals(SHUTDOWN_REQ) 

아니면 흐르는을하고, 함께 문자열을 비교할 계속할 수 =/==!

private static final String SHUTDOWN_REQ = "SHUTDOWN".intern(); 

하지만이 더러운 해킹 당신은 자신의 코드를 차단

+0

인턴은'=='비교가 작동한다는 것을 보장하지 않습니다 (예 :'item = new String ("SHUTDOWN"); item == SHUTDOWN_REQ'는 false를 반환합니다). – assylias

+0

물론이 경우 모든 문자열을 받아 들여야합니다. – Mikhail

+0

대단히 감사합니다. – Thomas

관련 문제