다음을 통해 공유


스레드 일시 중지 및 중단

스레드 활동을 동기화하는 가장 일반적인 방법은 스레드를 차단 및 해제하거나 코드의 개체 또는 영역을 잠그는 것입니다. 이러한 잠금 및 차단 메커니즘에 대한 자세한 내용은 동기화 기본 형식개요를 참조하세요.

스레드를 잠자기 상태로 만들 수도 있습니다. 스레드가 차단되거나 절전 모드인 경우 ThreadInterruptedException 사용하여 대기 상태에서 중단될 수 있습니다.

Thread.Sleep 메서드

Thread.Sleep 메서드를 호출하면 현재 스레드는 메서드에 전달된 밀리초 또는 시간 간격 동안 즉시 차단되고, 남은 시간 슬라이스를 다른 스레드에 양보합니다. 해당 간격이 경과하면 절전 모드 스레드가 실행을 다시 시작합니다.

한 스레드는 다른 스레드에서 Thread.Sleep 호출할 수 없습니다. Thread.Sleep 항상 현재 스레드가 절전 모드로 전환되는 정적 메서드입니다.

Timeout.Infinite 값으로 Thread.Sleep을(를) 호출하면, 스레드가 다른 스레드에 의해 Thread.Interrupt 메서드가 호출되어 중단되거나 자신의 Thread.Abort 메서드 호출로 종료될 때까지 스레드가 대기 상태로 전환됩니다. 다음 예제에서는 잠자고 있는 스레드를 중단하는 두 가지 방법을 보여 줍니다.

using System;
using System.Threading;

public class Example
{
   public static void Main()
   {
      // Interrupt a sleeping thread.
      var sleepingThread = new Thread(Example.SleepIndefinitely);
      sleepingThread.Name = "Sleeping";
      sleepingThread.Start();
      Thread.Sleep(2000);
      sleepingThread.Interrupt();

      Thread.Sleep(1000);

      sleepingThread = new Thread(Example.SleepIndefinitely);
      sleepingThread.Name = "Sleeping2";
      sleepingThread.Start();
      Thread.Sleep(2000);
      sleepingThread.Abort();
   }

   private static void SleepIndefinitely()
   {
      Console.WriteLine($"Thread '{Thread.CurrentThread.Name}' about to sleep indefinitely.");
      try {
         Thread.Sleep(Timeout.Infinite);
      }
      catch (ThreadInterruptedException) {
         Console.WriteLine($"Thread '{Thread.CurrentThread.Name}' awoken.");
      }
      catch (ThreadAbortException) {
         Console.WriteLine($"Thread '{Thread.CurrentThread.Name}' aborted.");
      }
      finally
      {
         Console.WriteLine($"Thread '{Thread.CurrentThread.Name}' executing finally block.");
      }
      Console.WriteLine($"Thread '{Thread.CurrentThread.Name} finishing normal execution.");
      Console.WriteLine();
   }
}
// The example displays the following output:
//       Thread 'Sleeping' about to sleep indefinitely.
//       Thread 'Sleeping' awoken.
//       Thread 'Sleeping' executing finally block.
//       Thread 'Sleeping finishing normal execution.
//
//       Thread 'Sleeping2' about to sleep indefinitely.
//       Thread 'Sleeping2' aborted.
//       Thread 'Sleeping2' executing finally block.
Imports System.Threading

Module Example
    Public Sub Main()
        ' Interrupt a sleeping thread. 
        Dim sleepingThread = New Thread(AddressOf Example.SleepIndefinitely)
        sleepingThread.Name = "Sleeping"
        sleepingThread.Start()
        Thread.Sleep(2000)
        sleepingThread.Interrupt()

        Thread.Sleep(1000)

        sleepingThread = New Thread(AddressOf Example.SleepIndefinitely)
        sleepingThread.Name = "Sleeping2"
        sleepingThread.Start()
        Thread.Sleep(2000)
        sleepingThread.Abort()
    End Sub

    Private Sub SleepIndefinitely()
        Console.WriteLine("Thread '{0}' about to sleep indefinitely.",
                          Thread.CurrentThread.Name)
        Try
            Thread.Sleep(Timeout.Infinite)
        Catch ex As ThreadInterruptedException
            Console.WriteLine("Thread '{0}' awoken.",
                              Thread.CurrentThread.Name)
        Catch ex As ThreadAbortException
            Console.WriteLine("Thread '{0}' aborted.",
                              Thread.CurrentThread.Name)
        Finally
            Console.WriteLine("Thread '{0}' executing finally block.",
                              Thread.CurrentThread.Name)
        End Try
        Console.WriteLine("Thread '{0}' finishing normal execution.",
                          Thread.CurrentThread.Name)
        Console.WriteLine()
    End Sub
End Module
' The example displays the following output:
'       Thread 'Sleeping' about to sleep indefinitely.
'       Thread 'Sleeping' awoken.
'       Thread 'Sleeping' executing finally block.
'       Thread 'Sleeping finishing normal execution.
'       
'       Thread 'Sleeping2' about to sleep indefinitely.
'       Thread 'Sleeping2' aborted.
'       Thread 'Sleeping2' executing finally block.

스레드 중단

차단된 스레드에서 Thread.Interrupt 메서드를 호출하여 ThreadInterruptedExceptionthrow하여 대기 스레드를 중단할 수 있습니다. 그러면 스레드가 차단 호출에서 중단됩니다. 스레드는 ThreadInterruptedException를 처리하고 작업을 계속하기 위해 적절한 작업을 수행해야 합니다. 스레드가 예외를 무시하면 런타임에서 예외를 catch하고 스레드를 중지합니다.

비고

Thread.Interrupt 호출될 때 대상 스레드가 차단되지 않으면 스레드가 차단될 때까지 중단되지 않습니다. 스레드가 차단되지 않으면 중단 없이 완료될 수 있습니다.

관리 대기인 경우, Thread.InterruptThread.Abort 모두 스레드를 즉시 깨웁니다. 대기가 관리되지 않는 대기(예: Win32 WaitForSingleObject 함수에 대한 플랫폼 호출)인 경우 Thread.Interrupt 또는 Thread.Abort 관리 코드로 반환되거나 관리 코드로 호출될 때까지 스레드를 제어할 수 없습니다. 관리 코드에서 동작은 다음과 같습니다.

참고하십시오