2012-12-07 7 views
0

스레드를 확장하는 클래스를 만들었습니다.스레드를 완전히 멈출 수 없습니다.

이 클래스에는 프로세스 및 IO 스트림을 사용하여 파일을 다운로드하는 데 몇 분이 걸리는 몇 가지 메서드가 있습니다.

나는 또한 스레드를 멈추는 데 사용하는 JButton을 가지고있다. 현재 ActionListener를 가지고 있는데,이 ActionListener는 ClassName.this.stop()을 수행한다. 이것은 완벽하게 작동합니다.

'public void run()'메서드 내에서 이러한 메서드 중 일부를 실행하고 스레드를 시작합니다.

제 질문은 인터프리터()를 사용하여 내 비추천 Thread.stop() 메서드를 대체하고 스레드를 정상적으로 종료하는 데 사용할 수있는 방법은 무엇입니까?

부울 플래그를 사용하여 스레드가 인터럽트되었는지 확인하지만 run() 메서드가 단순히 일련의 메서드를 실행한다는 것을 확인하는 것이 좋습니다. 일부 메서드는 루프가 모든 메서드를 평가할 때까지 평가되지 않습니다. 실행을 마쳤으며, 심지어는 'InterrupedException'이 발생하고 루프가 다시 시작됩니다.

또 다른 문제는 다운로드가 진행중인 경우 다운로드가 완료되고 스레드가 중단되었는지 다음 번에 확인하기 위해 몇 분이 걸릴 수 있다는 것입니다. 나는 모든 것을 멈추고 객체가 '그 자체와 그 안에있는 모든 것을 삭제'하고 싶습니다. Thread.stop()이 현재 올바르게하고 있습니다.

아무도 아이디어가 없습니까?

+0

다음 줄을 따라 뭔가를 시도하십시오 ... http://stackoverflow.com/questions/13656244/given-two-java-threads-stop-one-thread-when-one-of-them-finishes/13659892#13659892 – xagyg

답변

2

여분의 불린 센티넬 플래그를 사용하지 말고 인터럽트 메커니즘에 전적으로 의존하십시오. 중단 가능한 차단 방법에 시간을 투자하지 않는 장기간의 작업에서. 때때로 Thread.interrupted()의 수표를 수락하고 true 인 경우 작업을 중단해야합니다. 루프가 InterruptedException 이후에 계속되면이 동작을 수정하십시오. 이 부분은 완전히 당신 손에 달려 있습니다. 예외를 무시하지 마십시오. 작업을 줄이고 방법을 끝내서 반응하십시오.

+0

저에게있어 여러 가지 IF 검사를 여러 가지 방법에 추가하여 스레드가 종료되었는지 확인하는 것은 의미가 없습니다. 경우에 따라 다운로드가 완료 될 때까지 수표가 실행되지 않습니다. – Cristian

+0

인터럽트 가능한 코드가 작성되는 방법입니다. 다운로드를 수행하는 경우 I/O 코드를 차단하는 데 많은 시간이 소요됩니다. 인터럽트 가능 I/O를 사용하십시오. –

+0

그것은 많은 반복처럼 보이고, 초당 여러 번 실행되는 루프를 사용할 때 속도가 느려질 수 있습니다. 스레드의 모든 측면을 매우 깨끗하게 중지 할 필요는 없습니다. 모든 작업을 중단하고 GC에 사용할 수있게 만들고 싶습니다. 인터럽트 가능한 I/O를 읽어 보겠습니다. – Cristian

관련 문제