2016-09-26 7 views
0

이전에 동일한 스레드가 Java eclipse luna에서 실행 중이었지만 중단이 나타났습니다. 이전에 루나에서 실행 된 동일한 스레드가 Java EE IDE에서 실행되지 않는 동일한 스레드로 변경되었습니다.Java에서 스레드가 작동하지 않습니다

public void clockTime(){ 
     Thread clock=new Thread(){ 
      public void run(){ 
       try { 
        for(;;){ 
         Calendar cald=new GregorianCalendar(); 
         day=cald.get(Calendar.DAY_OF_MONTH); 
         month=cald.get(Calendar.MONTH); 
         year=cald.get(Calendar.YEAR); 


         seconds=cald.get(Calendar.SECOND); 
         minutes=cald.get(Calendar.MINUTE); 
         hours=cald.get(Calendar.HOUR); 
         lblClock.setText("<html>"+hours+":"+minutes+":"+seconds+"<br>"+day+"/"+month+"/"+year+"</html>"); 
        sleep(1000); 
        } 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }; 
     clock.start(); 

     } 

어느 하나 도와주세요. ??. 생성자에 메서드를 호출합니다. 이미 본 적이 없지만, 스레드를 제거하면 필요에 따라 시간과 날짜가 표시되기 때문에 메서드가 실행됩니다. 그러나 루프와 영원히 루프가 없어서 변경되지 않습니다.

+0

귀하의 질문에 당신은 그것의 스타일을 개선하고 이해를 쉽게하기 위해 편집해야 명확하지 않다. –

답변

3

이 다음 스윙 응용 프로그램 인 경우 :

  • 것은 당신의 GUI는 당신이 만들고있어 그 Runnable를
  • 에서 시작 SwingUtilities.invokeLater(Runnable);를 호출하면, 스윙 이벤트 스레드에서 응용 프로그램을 시작 있는지 확인은 위의 코드에서 Swing 이벤트 스레드 (EDT)의 키를 (즉, lblClock.setText(...) 호출)이라고합니다. 위와 같은 방법으로 Swing 이벤트 스레드에서만 호출되어야합니다.
  • SwingWorker을 사용하고 게시/처리 방법 쌍에서 setText를 호출 할 수 있습니다.
  • 또는 (위의 코드가 위와 같습니다) 위 코드를 모두 척하고 Swing Timer을 사용하십시오. 훨씬 더 간단하고, 모든 호출이 이벤트 스레드에 있기 때문에 Swing 이벤트에 대해 걱정할 필요가 없습니다.

스윙 타이머 경로로 간다면 원하는 지연 (여기서는 1000msec)과 동일한 int를 생성자에 전달합니다. Timer의 ActionListener는 반복적으로 호출되며 시간 값을 얻은 다음이를 사용하여 JLabel에 전달하는 String을 만듭니다.

예를 들어

, 뭔가 대략 같은 :

int timerDelay = 1000; 
Timer timer = new Timer(timerDelay, new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     // calculations to get time Strings 
     String text = ..... // use calculations above 
     lblClock.setText(text); 
    } 
}); 
timer.start(); 

주 그 코드가 테스트되지 않았습니다