2014-07-08 2 views
0

내 프로젝트에서 타사 라이브러리를 가져 왔고 지금은 Websphere에 게시합니다. ServletContextListener을 사용하여 내 애플리케이션의 모든 트레드를 지우고 Thread.stop() 메소드를 사용합니다. 이 응용 프로그램을 재배포, 나는 여전히 살아있는 오래된 스레드를 발견, 나는 인터넷에서 검색하고 소리내는 소리 회원 또는 인터럽트()와 함께 소리를 사용하지만 제 3 자 lib에 해킹하고 싶지 않아 그래서 누가 줄 수 있는지 나 힌트? 다음과 같은
감사합니다 :)
타사 LIB 코드 : 타사 라이브러리에서 가져온 스레드를 죽이는 방법은 무엇입니까?

public void run() { 
     while (true) { 
      try { 
       for (DefaultFuture future : FUTURES.values()) { 
        if (future == null || future.isDone()) { 
         continue; 
        } 
        if (System.currentTimeMillis() - future.getStartTimestamp() > future.getTimeout()) { 
         // create exception response. 
         Response timeoutResponse = new Response(future.getId()); 
         // set timeout status. 
         timeoutResponse.setStatus(future.isSent() ? Response.SERVER_TIMEOUT : Response.CLIENT_TIMEOUT); 
         timeoutResponse.setErrorMessage(future.getTimeoutMessage(true)); 
         // handle response. 
         DefaultFuture.received(future.getChannel(), timeoutResponse); 
        } 
       } 
       Thread.sleep(30); 
      } catch (Throwable e) { 
       logger.error("Exception when scan the timeout invocation of remoting.", e); 
      } 
     } 
    } 


나는 간단한 로컬 테스트를 만들고, 것은 Thread.stop()를, 나는이 스레드를 중지하고 지역의 부두를 사용할 수 있습니다 발견 그것을 설명 할 수있는 문제를 재현 할 수 있습니까?


내 로컬 테스트 코드 :

public class Test { 
public static void main(String[] args) throws InterruptedException, IOException { 
    myThread t1 = new myThread(); 
    t1.start(); 
    Thread.sleep(4000); 
    t1.stop(); 
    System.in.read(); 
} 

}

class myThread extends Thread{ 
@Override 
public void run() { 
    int i=0; 
    while(true){ 
     try { 
      System.out.println(i++); 
      Thread.sleep(30); 
     } catch (Throwable e) { 
      e.printStackTrace(); 
     } 
    } 
} 

}

+0

무엇이 문제입니까? 이 스레드가 당신에게 어떤 문제가 있습니까? –

+0

우리는 단지 응용 프로그램을 재배포 할 때마다 새로운 스레드가 생성 될 것이며, 일부 메모리 누수가 발생할 수 있다고 생각합니다. – taoeaten

+0

어떻게이 Third Party 스레드를 시작 하시겠습니까? 그것이 Runnable을 구현하는 것처럼 보입니다. 하지만 직접 쓰레드 인스턴스를 생성하고 시작해야합니까? 아니면 제 3 자 API가 그렇게합니까? – shazin

답변

1

정지 방법이 사용되지 않습니다. 그것은 안전하지 않습니다.

내가 대신 Thread.stop를 어떻게 사용해야합니다 Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?.

단락을 참조하십시오 - 당신은 오라클 튜토리얼을 읽어야? 예를 들어, 중지하고, 당신의 애플릿이 다음 시작을 포함한다고 가정 실행 방법 : 당신은 애플릿의 정지와 실행 방법을 대체하여 Thread.stop를의 사용을 피할 수

private Thread blinker; 

public void start() { 
    blinker = new Thread(this); 
    blinker.start(); 
} 

public void stop() { 
    blinker.stop(); // UNSAFE! 
} 

public void run() { 
    while (true) { 
     try { 
      Thread.sleep(interval); 
     } catch (InterruptedException e){ 
     } 
     repaint(); 
    } 
} 

: 개인 휘발성 스레드 깜박이;

public void stop() { 
    blinker = null; 
} 

public void run() { 
    Thread thisThread = Thread.currentThread(); 
    while (blinker == thisThread) { 
     try { 
      Thread.sleep(interval); 
     } catch (InterruptedException e){ 
     } 
     repaint(); 
    } 
} 

왜 타사 클래스를 확장하고, 스레드 방법을 다시 작성하지?

관련 문제