2013-06-15 4 views
2

나는 자바 안드로이드 플랫폼에서 일하고있다. 주 스레드에서 자식 스레드를 만들고 있습니다. 내 요구 사항으로 자식 스레드를 중지하고 싶습니다. 우리 자식 스레드는 루프가없는 간단한 함수를 가지고있다. 나는 언제든지 자식 스레드를 죽이고 사용하고있는 리소스를 무료로 사용하려고합니다.자바에서 부모 스레드에서 자식 스레드를 죽이고

Thread tChild; 
tChild = new Thread(new childThread(), "Child Thread"); 
tChild.start(); 

내 실행() 함수는이 같은 호출 기능입니다 :

public class childThread implements Runnable{ 
    public void run() { 
    firstFunction(); 
    secondFunction(); 
    } 
} 

홈페이지의 thread가 위의 시작하려면이 코드를 가지고 : function.my 스레드가) (나는 그것을 검색 나는 inturrupt 발견 . 이걸 inturrupt()로 어떻게 사용합니까? 자식 스레드를 죽이고 리소스를 할당 해제하는 다른 방법을 알려주십시오. 고맙습니다.

+0

나는 내 질문을 편집하여 코드를 작성하여 자식 스레드를 시작하는 방법을 알려주었습니다. – navalp3

답변

3

, 당신은 그것을 지원하는 방법을 사용하여 스레드를 중지 할 수 있습니다, 당신은 루프를 필요는 없지만, 개념적으로 같은 것을 할 것이라는 점을 알고있다. 실의 협력이 없다면 멈출 수있는 정상적인 방법이 없습니다. 예를 들어, 스레드가 잠금을 보유하고 공유 자원을 유효하지 않은 상태로 만든 경우를 고려하십시오. 협력없이 그 스레드를 어떻게 멈출 수 있습니까? 그들은 당신이 그들을 싶지 않아 일을하지 않도록

  1. 코드 당신의 스레드 :

    당신은 두 가지 선택이있다. 그들이 할 일이 없을 때 스스로 끝내도록 코드를 작성하십시오. 그렇게하면 외부에서 "도달"할 다른 스레드가 필요하지 않습니다.

  2. 스레드를 종료해야한다고 알리는 방법을 제공하도록 코드를 작성한 다음 깨끗하게 종료하십시오.

그러나 선택 사항이므로 마술을 사용할 수 없습니다.

자동차를 빌린 누나처럼 일을하는 실을 생각해보십시오. 차가 필요할 경우 자매의 협조가 필요합니다. 당신은 차를 필요로 할 때 그녀가 돌아올 수 있도록 준비하거나 차를 필요로 할 때 그녀에게 이야기 할 수 있도록 준비 할 수 있습니다. 그러나 당신은 그녀가 차를 다시 가져 오는 방법을 알아야하거나 되돌아 가지 않을 것이라는 사실을 바꿀 수 없다.

스레드는 프로세스 리소스를 조작하여 유효하지 않은 상태로 만듭니다. 프로세스를 종료하기 전에 수리해야하거나 프로세스 컨텍스트가 손상됩니다.

0

귀하의 하위 스레드는 Thread.interrupted()을 정기적으로 확인하고 그것이 true를 반환하면 종료해야합니다.

코드에 루프가 있는지 여부는 중요하지 않습니다. 취소가 필요한지 확인하려면 코드 실행 경로에서 다양한 지점을 선택하기 만하면됩니다.

+0

Thread.interrupted()을 어떻게 확인합니까 ?? 루프를 사용하고 있지 않습니다. – navalp3

+0

우리가 여기서 할 수있는 일은 중단 된 스레드에 대한 문서에서 반복하는 내용이므로이 링크를 참조하십시오 (http://developer.android.com/reference/java/lang/Thread.html#interrupt()) –

0

그냥 tChild 객체에 방해를 호출하고 Thread.interrupted() 값을 확인 어떤 루프를 가지고 있지 않기 때문에 그것은 당신의 아이 thread

Thread tChild; 
tChild = new Thread(new childThread(), "Child Thread"); 
tChild.start(); 
//... 
tChild.interrupt(); 
+1

예 그것은 inturrupt 자식 스레드하지만 tChild.interruped() 때마다 어떻게 그 스레드를 멈추지 검사 할 수 없습니다 ??? – navalp3

2

중단됩니다, 나는 가정 당신의하여 firstFunction() ; secondFunction(); 무거운 작업을 수행하면 함수 내의 적절한 지점을 확인해야합니다 firstFunction(); secondFunction(); 조건 Thread.interrupted()를 실행 해, true의 경우는 메소드를 종료합니다. 나는 스레드의 협력

Runnable runnable = new Runnable() { 
     private int counter; 

     public void run() { 
     while(true){ 
      System.out.println(">> Executing " + counter++); 

      if(Thread.interrupted()){ 
      break; 
      } 
     } 

     } 
    }; 

    Thread thread = new Thread(runnable); 
    thread.start(); 

    Thread.sleep(10 * 1000); 

    thread.interrupt(); 
+0

사용하려고하면 firstFunction() 및 secondFunction()을 어디에 두어야합니까? ??? – navalp3

+0

내부'public void run() {firstFunction(); secondFunction();}'. 'if (Thread.interrupted()) {...}'함수가 자식 스레드가 인터럽트 된 경우 함수를 중지해야한다고 생각하는 지점에서 함수 내부에서 수행해야합니까? –

+0

.. inside while loop 또는 out ... while while while while while put while while interrupt while firstFunction() and secondFunction()이 함수는 반복적으로 실행될 것입니다. while 함수를 사용하지 않으면 interrupt()를 사용하지 않아도됩니다. – navalp3

0

try catch로 코드를 둘러 쌉니다. InterruptedException을 catch 한 다음 나옵니다. 루프가있는 경우 catch 문을 루프 외부에 배치하거나 catch가 내부에 있으면 루프를 중단하십시오.

Runnable runnable = new Runnable() { 
     public void run() { 
      try { 
       while(true) { 
        // your code 
       }     
      }(InterruptedException e) { 
       // It comes out 
      } 
} 
관련 문제