2014-04-19 4 views
2

스레드를 실행하는 프로그램이 있습니다. 사용자가 종료 단추 (사용자 지정 단추)를 클릭하면 스레드가 멈추도록 지시 한 다음 JFrame을 처리합니다. 그러나 스레드는 계속 실행됩니다. 내 CPU를 100 % 크랭크 업; 버튼을 클릭 할 때마다 시계가 열립니다. 이것은 그것을 여는 코드입니다. 스레드 실 거예요

new ClockGui().main(); 

ClockGui

시계이며, 별도의 주 된 .java 파일이 포함되어 내 패키지 내의 별도 된 .java 파일입니다.

또한 도움이된다면 버튼을 클릭 할 때마다 CPU가 50 % 올라간다는 사실을 알았고 JFrame을 닫으면 ClockGui, 즉 CPU가 다운됩니다 25 %. 이는 여전히 25 % 증가한 수치입니다. 그래서 문제가 주요 .java 파일에 있다고 추측합니다. 어쩌면 내가 ClockGui에 전화하는거야?

public boolean running = true; 
... 
private void exitButtonMouseClicked(java.awt.event.MouseEvent evt) { //this is the event that happens when I click the exit button          
     running = false; 
     this.dispose(); //this closes the JFrame 
} 
public class myThread extends Thread { 
     @Override 
     public void run() { 
      while(running) { 
       ... 
      } 
     } 
    } 

예상대로 JFrame이 닫히지만 CPU는 여전히 100 %입니다. 스레드를 올바르게 닫고 있습니까? 문제를 어떻게 해결합니까? 스레드를 중지하고 싶습니다.

+0

이 우리를 표시 줄 :

당신은 running로 선언해야한다. 또는 스택 스냅 샷을 jstack으로 가져 와서 가장 깊은 세 가지 코드를 제공하십시오. – Basilevs

답변

7

volatile 변수가 다른 스레드로 (즉각적으로,시기 적절하게 또는 전혀) 전파되지 않을 수 있습니다 (특히 HotSpot 최적화가 발생할 경우). 아마도 running = false은 죽은 저장소로 간주되어 무시됩니다. 디버거 세션에서 회전 유지

public volatile boolean running = true; 
+0

JFrame을 닫은 후에도 여전히 CPU가 과열됩니까? 어떤 아이디어? – Arc

+1

@Arc 그러면 우리에게 문제가 될지도 모른다는 논리가 있습니다. – hexafraction

+0

@hexafrction 내 게시물을 편집하겠습니다. – Arc