스레드 일시 중지 및 중단

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

스레드가 자동으로 중지되도록 할 수도 있습니다. 스레드가 차단 또는 중지된 경우 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 '{0}' about to sleep indefinitely.",
                        Thread.CurrentThread.Name);
      try {
         Thread.Sleep(Timeout.Infinite);
      }
      catch (ThreadInterruptedException) {
         Console.WriteLine("Thread '{0}' awoken.",
                           Thread.CurrentThread.Name);
      }
      catch (ThreadAbortException) {
         Console.WriteLine("Thread '{0}' aborted.",
                           Thread.CurrentThread.Name);
      }
      finally
      {
         Console.WriteLine("Thread '{0}' executing finally block.",
                           Thread.CurrentThread.Name);
      }
      Console.WriteLine("Thread '{0} finishing normal execution.",
                        Thread.CurrentThread.Name);
      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 메서드를 호출하여 ThreadInterruptedException을 throw하면 스레드가 차단 호출에서 분리되어 대기 스레드를 중단할 수 있습니다. 스레드는 ThreadInterruptedException을 catch하고 작업을 계속하는 데 필요한 동작을 수행해야 합니다. 스레드가 예외를 무시하는 경우 런타임은 예외를 catch하고 스레드를 중지합니다.

참고 항목

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

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

참고 항목