2014-04-23 3 views
0

정상적으로 실행중인 스레드 (sleep() 또는 wait() 상태가 아님)를 인터럽트하려고합니다.Java에서 정상적으로 실행중인 스레드 인터럽트

그물을 통과하는 동안 정상적으로 실행중인 스레드를 방해하는 것은 플래그를 true로 설정하고 프로세스를 계속 진행하게됩니다. 내가 one.java에서 예외 블록을 얻을 수 있습니다 예외 : InterruptedException을 던질 때

코드는, two.java에서 two.java

..... 
..... 
stop method() throws InterruptedException{ 
     if(!(t.isInterrupted())){ 
      t.interrupt(); 
      throw new InterruptedException(); 
     } 
} 

one.java

...... 
...... 
actionperformedmethod { 

if (actionCmd.equals("cancel")) { 
    try { 
     r1.stop(); // to two.java 
    } catch (InterruptedException ex) { 
     .... 
     .... 
    } 
} 
} 

하지만, 그 스레드가 정상적인 프로세스를 계속하는 것처럼 보이기 때문에 스레드를 중지하는 방법은 무엇입니까? 도와주세요 개념 스레드 새로운

암 ..

+0

이 당신에게 흥미있을 수 있습니다받을 때마다 http://stackoverflow.com/questions/10961714/how-to-properly -stop-the-thread-in-java? – Willmore

답변

0

인터럽트는 스레드를 중지하지 않습니다. 스레드가 곧 실행을 멈추도록 신호를 보내려면 플래그를 true로 설정하면됩니다.

는 스레드의 run() 내부에 2 등석

public void requestExit(){ 
    exit = true; 
} 

하나의 방법을 추가 실행이

private volatile boolean exit = false; 

으로 전역 변수를 추가 중지하고이

if (exit == true){ 
    return; 
    } 
그런 짓을

언제든지 이 메소드를 requestExit()라고 부르길 원한다면 main() 또는 멈추고 자하는 곳에서 호출하십시오.

이것이 스레드를 멈추는 가장 좋은 방법입니다. 스레드에서 stop()을 사용하면 명확하지 않으므로 위험합니다 오라클에 의해서조차 사용되지 않는 모든 자원과 그것의 사용을 권장하지 않습니다. 배경 작업을 적극적으로 적당한 간격으로 Thread.interrupted()을 확인하고 깨끗하게 자체를 종료 조치를 취할 필요가있다 -

interrupt() 방법은 협력보다는 선제 나를이 문제

+0

답장을 보내 주셔서 감사합니다 .. 내부 메서드를 실행 내가 6 가지 방법을 가지고, 내 의심은 내가 (출구 == 사실)의 체크를 넣어해야합니까 ?? run() 내부의 각 메소드 호출 전에 거기에 있어야합니까? – madhu

+0

예 처음부터 계속하는 것이 더 낫지 만 몇 가지 메서드를 실행하여 해당 메서드 호출 후에 필수 조건을 넣으려면 다시 시도하십시오. –

+0

예 실행 방법의 시작 부분에이 종료가 있습니다 == true 내 탐색이 있습니다. 프로그램이 run() 내에서 세 번째 메소드를 실행 중이고 스레드를 인터럽트하는 경우 세 번째 메소드가 실행을 완료 한 후에 만 ​​알 수 있습니다. (네 번째 메소드 이전에 체크 (exit == true) 확인) – madhu

0

스레드는 자신의 run() 방법 동안 실행하는 사람들이 실행 방법 안에 while(true)을 넣어 그래서 일반적으로 스택에, 당신이 필요로하는 모든 당신이 중지 스레드에서해야 할 일 run 메소드의 어딘가에서 return으로 가거나 루프를 깨뜨린 다음 run() 메소드가 더 이상 실행되지 않으면 스레드가 중지되었습니다.

+0

run 메서드의 실행이 중간에있는 경우 어떻게 인터럽트 플래그를 기반으로하는 return 또는 break 루프를 사용할 수 있습니까 ?? – madhu

3

에 대해 알려주세요. 이 예에서

public void run() { 
    openSomeResources(); 
    try { 
    while(notFinished) { 
     if(Thread.interrupted()) return; 
     doSomeStuff(); 
    } 
    } finally { 
    closeTheResources(); 
    } 
} 

스레드가 다음의 중단에 응답하기 전에 현재의 "반복"을 완료 doSomeStuff()의 중간에 중단 된 경우. 한편으로 인터럽트에 즉각적으로 응답하고 다른 한편으로는 실행의 안전 지점에서만 응답하는 것 사이의 올바른 균형을 잡는 것은 특정 작업에 본질적으로 특정한 것입니다. 모든 대답.

그러나이 예외가 throw되면 InterruptedException을 던지는 차단 메서드는 중첩 플래그를 다시 설정합니다. 따라서 당신이 자신을 다시 중단해야한다 작동 확인 이러한 종류 위해서는 당신이 InterruptedException

try { 
    Thread.sleep(3000); 
} catch(InterruptedException e) { 
    // we were interrupted - set the flag so the next interrupted() check will 
    // work correctly. 
    Thread.currentThread().interrupt(); 
}