development

스레드가 Java에서 어떻게 닫혀 야합니까?

big-blog 2020. 11. 21. 09:36
반응형

스레드가 Java에서 어떻게 닫혀 야합니까?


이것은 짧은 질문입니다. 어느 시점에서 내 스레드는 자살해야한다는 것을 이해합니다. 가장 좋은 방법은 무엇입니까?

  1. Thread.currentThread (). interrupt ();
  2. 반환;

그건 그렇고, 왜 첫 번째 경우에 우리는 사용해야 currentThread합니까? Thread현재 스레드를 참조하지 않는 이유는 무엇입니까?


스레드 를 종료하려면 그냥 반환해도됩니다. 호출 할 필요 Thread.currentThread().interrupt()가 없습니다 (그렇지만 나쁜 것은 없습니다. 그럴 필요가 없습니다.) 이것은 interrupt()기본적으로 스레드 소유자에게 알리기 위해 사용 되기 때문 입니다 (음, 100 % 정확하지는 않지만 일종의 ). 당신이 스레드의 소유자이고 스레드를 종료하기로 결정했기 때문에 알리는 사람이 없으므로 호출 할 필요가 없습니다.

그런데 왜 첫 번째 경우에 currentThread를 사용해야합니까? 스레드가 현재 스레드를 참조하지 않습니까?

예, 그렇지 않습니다. 예를 들어 Thread.sleep ()이 현재 스레드에 영향을 미치기 때문에 혼란 스러울 수 있지만 Thread.sleep ()은 정적 메서드입니다.

스레드의 소유자가 아닌 경우 (예 : 확장 Thread및 코딩 하지 않은 경우 Runnable등) 다음을 수행해야합니다.

Thread.currentThread().interrupt();
return;

이렇게하면 실행 가능 항목을 호출 한 코드가 스레드가 중단되었음을 알 수 있습니다 = (일반적으로) 수행중인 작업을 중지하고 종료해야합니다. 앞서 말했듯이, 그것은 단지 의사 소통의 메커니즘 일뿐입니다. 소유자는 단순히 중단 된 상태를 무시하고 아무 작업도하지 않을 수 있습니다. 그러나 중단 된 상태를 설정하면 나중에 누군가 감사 할 수 있습니다.

같은 이유로, 당신은 절대로

Catch(InterruptedException ie){
     //ignore
}

그렇게하면 거기에서 메시지를 중지하게됩니다. 대신해야합니다

Catch(InterruptedException ie){
    Thread.currentThread().interrupt();//preserve the message
    return;//Stop doing whatever I am doing and terminate
}

실행 메소드가 종료되면 스레드가 종료됩니다.

루프를 사용하는 경우 적절한 방법은 다음과 같습니다.

// In your imlemented Runnable class:
private volatile boolean running = true;

public void run()
{
   while (running)
   {
      ...
   }
}


public void stopRunning()
{
    running = false;
}

물론 돌아 오는 것이 가장 좋은 방법입니다.


당신이 최고 수준에있을 경우 - 또는 수 깨끗하게 얻을 최고 수준 - 스레드, 그럼 그냥 돌아 좋다. 예외를 던지는 것은 그다지 깨끗하지 않습니다. 예외를 포착하고 무시할 수있는 것이 없다는 것을 확인할 수 있어야하기 때문입니다.

사용해야하는 이유 Thread.currentThread()호출에 위해가 interrupt()interrupt()인스턴스 방법입니다 - 당신은 당신의 경우, 현재의 thread 될 일이 방해하려는 스레드에 호출 할 필요가있다. 인터럽트는 스레드가 다음 번에 차단 될 때 (예 : IO 또는 모니터 용)에만 알 수 있습니다. 예외가 즉시 발생한다는 의미는 아닙니다.


단순히을 호출 interrupt()하면 스레드가 자동으로 닫히지 않습니다. 대신 스레드는 그에 따라 구현 되면 계속 살아 있을 수도 있습니다 isInterrupted(). OP에서 요청한대로 스레드 를 확실하게 닫는 유일한 방법

Thread.currentThread().stop();

그러나 메소드는 더 이상 사용되지 않습니다.

Calling return only returns from the current method. This only terminates the thread if you're at its top level.

Nevertheless, you should work with interrupt() and build your code around it.


Thread is a class, not an instance; currentThread() is a static method that returns the Thread instance corresponding to the calling thread.

Use (2). interrupt() is a bit brutal for normal use.

참고URL : https://stackoverflow.com/questions/2491588/how-a-thread-should-close-itself-in-java

반응형