2011-02-15 2 views
1

Hy!Thread.interrupt()가 작동하지 않습니다.

My Thread.interrupt가 작동하지 않습니다.

코드 (미국 전역) :

//Call 

us = new UpdateState(params, hup); 
      us.start(); 

//Interupt 
@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     if (item.getItemId()== R.id.stopthread) 
     { 
      Log.e("Kill", "Kill"); 
      us.interrupt(); 
     } 
     return super.onOptionsItemSelected(item); 
    } 

등급 :

package android.skiptvad; 

import java.util.List; 

import org.apache.http.NameValuePair; 

import android.os.Handler; 
import android.os.Message; 
import android.text.NoCopySpan.Concrete; 
import android.util.Log; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.util.Log; 

public class UpdateState extends Thread { 

    public List<NameValuePair> params; 
    public Handler handler; 
    public Handler ins; 

    public UpdateState(List<NameValuePair> params, final Handler handler) { 
     this.handler = handler; 
     this.params = params; 
     this.ins = new Handler(){ 
      @Override 
      public void handleMessage(Message msg) { 

       if (msg.obj.toString()!= null) 
       { 
        JSONParse json = null; 
        try 
        {  
          Message msg2 =new Message(); 
          Log.e("Channel_State_Update",msg.obj.toString()); 
          json = new JSONParse(msg.obj.toString()); 
          String state = json.getChannelState(); 
          Log.e("Channel_State_Send",state); 
          msg2.obj = state; 
          handler.sendMessage(msg2); 

        } 
        catch (final Exception e) 
        { 
          e.printStackTrace(); 
        } 
      } 
     } 
     }; 
    } 

    @Override 
    public void run() { 

      while (true) 
      { 
       if (!this.isInterrupted()) 
       { 
        HttpConnection con = new HttpConnection(params, "http://surfkid.redio.de/getChannelState", this.ins); 
        con.start(); 
        try { 
         Log.e("Sleep", "Begin"); 
         UpdateState.this.sleep(5000); 
         Log.e("Sleep", "End"); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         Log.e("Sleep", "Error"); 
         e.printStackTrace(); 
        } 
       } 




      //super.run(); 
     } 
    } 
} 

이 도와주세요

로그 :

02-15 18:50:30.317: ERROR/Sleep(10696): End 
02-15 18:50:30.347: ERROR/Sleep(10696): Begin 
02-15 18:50:30.677: ERROR/Channel_State_Update(10696): {"responseData":{"channelState":"0"},"responseDetails":null,"responseStatus":200} 
02-15 18:50:30.677: ERROR/Channel_State_Send(10696): 0 
02-15 18:50:30.677: ERROR/UPDATE(10696): 0 
02-15 18:50:35.347: ERROR/Sleep(10696): End 
02-15 18:50:35.357: ERROR/Sleep(10696): Begin 
02-15 18:50:35.897: ERROR/Channel_State_Update(10696): {"responseData":{"channelState":"0"},"responseDetails":null,"responseStatus":200} 
02-15 18:50:35.897: ERROR/Channel_State_Send(10696): 0 
02-15 18:50:35.897: ERROR/UPDATE(10696): 0 
02-15 18:50:36.868: ERROR/Kill(10696): Kill 
02-15 18:50:36.878: ERROR/Sleep(10696): Error 
02-15 18:50:36.908: ERROR/Sleep(10696): Begin 
02-15 18:50:37.427: ERROR/Channel_State_Update(10696): {"responseData":{"channelState":"0"},"responseDetails":null,"responseStatus":200} 
02-15 18:50:37.427: ERROR/Channel_State_Send(10696): 0 
02-15 18:50:37.427: ERROR/UPDATE(10696): 0 
02-15 18:50:41.909: ERROR/Sleep(10696): End 
02-15 18:50:41.927: ERROR/Sleep(10696): Begin 

답변

9

당신은 루프를 중단해야합니다

@Override 
public void run() { 
    while (!this.isInterrupted()) { // Exit when thread's interrupt flag is set 
     HttpConnection con = new HttpConnection(params, "http://surfkid.redio.de/getChannelState", this.ins); 
     con.start(); 
     try { 
      Log.e("Sleep", "Begin"); 
      UpdateState.this.sleep(5000); 
      Log.e("Sleep", "End"); 
     } catch (InterruptedException e) { 
      Log.e("Sleep", "Error"); 
      e.printStackTrace(); 

      // Restore interrupt flag after catching InterruptedException 
      // to make loop condition false 
      Thread.currentThread().interrupt(); 
     } 
    } 
} 
+2

더 axtavt의 답변을 설명하기 위해 : 당신이 예외 : InterruptedException, Thread.currentThread.isInterrupted()를 잡을 때 false로 다시 설정됩니다. InterruptException 잡기가 끝나면 this.isInterrupted()가 올바른 값을 갖도록 플래그를 복원해야합니다. – Tazzy531

+0

나는 실제로 인터럽트 상태를 다시 주장하기보다는 루프를 '중단'할 것을 제안합니다. 이 특정 예에서는 루프를 인터럽트의 소비자로 간주하므로 인터럽트 상태가 종료되면 false 여야합니다. 위의 인터럽트 상태를 true로 설정하면이 스레드를 다시 사용하면 인터럽트 상태가 계속 유지됩니다. –

1

무슨 일이 일어날 기대합니까? 대규모 while 루프에서 인터럽트 예외가 발생했습니다. break를 작성해야합니다. 예외 부분에서 루프를 빠져 나옵니다. if !this.isInterrupted() 행은 내부의 코드를 제거하여 루프를 매우 조밀하게하지만 루프는 여전히 외부에 있습니다. 스레드가 중단 될 때

관련 문제