본문 바로가기
개인 스터디

C# Thread(스레드) 주요 속성과 메서드

by 태운콩즙 2024. 10. 15.
728x90
반응형
  • 스레드의 속성
    • Name : 스레드의 명칭 지정
    • IsAlive : bool형 스레드가 살아있는지 죽었는지 확인
    • IsBackground
      • foreground : 주 스레드의 종료와 상관없이 독립적으로 작동하는 부 스레드
      • background : 주 스레드의 종료와 연계하여 같이 종료하는 부 스레드
      • public bool IsBackground {get; set; }
    • CurrentThread

기본 예제

namespace Thread_EX
{
    class Program
    {
        static void func()
        {
            int i = 0;
            while (true)
            {
                Console.Write($"{i++} ");
                Thread.Sleep(1000);
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(func));
            thread.Start();
            Console.WriteLine("Main 종료");
        }
    }
}

결과 값

main 스레드 가 종료되고 수가 계속 증가 하는 걸 볼 수 있다

그렇다면 위의 코드를 가지고 기본 속성을 다뤄 보자

IsBackground = true 사용

namespace Thread_EX
{
    class Program
    {
        static void func()
        {
            int i = 0;
            while (true)
            {
                Console.Write($"{i++} ");
                Thread.Sleep(1000);
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(func));
            thread.IsBackground = true;
            thread.Start();
            Console.WriteLine("Main 종료");
        }
    }
}

결과 값

IsBackground는 기본 값이 fales 이다

IsBackground = true 로 설정을 하게 되면 백 그라운드 스레드로 설정하겠다는 뜻이고 메인 스레드 가 종료되면 백 그라운드 스레드가 작업하던 수의 증가 출력을 상관없이 종료 시킨다

IsBackground 가 false 인 경우는 맨 처음 예제와 같이 메인 함수가 종료되어도 스레드는 종료 되지 않는다

CurrentThread

public static Thread CurrendThread{get;}

스레드는 독립된 아이디를 가진다

Thread.CurrentThread.GetHashCode()

namespace Thread_EX
{
    class Program
    {
        static void ThreadProc()
        {
            Console.WriteLine($"스레드 ID{Thread.CurrentThread.GetHashCode()}");
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(ThreadProc);

            thread.Start();
            Console.WriteLine($"메인 스레드 ID{Thread.CurrentThread.GetHashCode()}");
        }
    }
}

스레드 메서드

  • Start();
  • Join(); 스레드가 종료 될 때 까지 대기
namespace Thread_EX
{
    class Program
    {
        static void ThreadProc()
        {
            for (int i = 0; i < 10; i++) 
            {
                Console.Write($"{i}");
                Thread.Sleep( 200 );
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(ThreadProc));
            thread.Start();
            thread.Join(); // 위에 부 스레드가 끝날때 까지 메인종료 메세지( 주 스레드 ) 대기시킴
            Console.WriteLine("메인 종료");
        }
    }
}

  • Abort();
    • 이 함수를 호출한 곳의 현재 스레드를 중지
    • ThreadAbortException 예외 발생 try catch문 필요
    • CurrentThread.Abort();
namespace Thread_EX
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread th = new Thread(new ThreadStart(ThreadProc1));
            th.Start();

            Console.WriteLine($"Main 스레드 : {Thread.CurrentThread.GetHashCode}");
            Console.WriteLine("Main 종료");
        }
        private static void ThreadProc1()
        {
            Console.WriteLine($"ThreadProc1 아이디 : {Thread.CurrentThread.GetHashCode()}");
            Thread thread = new Thread(new ThreadStart(ThreadProc2));
            thread.Start();

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"{i * 10}");
                Thread.Sleep(200);
                if (i == 3)
                {
                    Console.WriteLine("ThreadProc1 종료");
                    Thread.CurrentThread.Abort();
                }
            }
        }
        private static void ThreadProc2()
        {
            Console.WriteLine($"ThreadProc2 아이디 : {Thread.CurrentThread.GetHashCode()}");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"{i}");
                Thread.Sleep(200);
            }
            Console.WriteLine("ThreadProc2 종료");
        }
    }
}

Abort() 를 사용 하면 스레드를 특정 부분에서 정지할 수 있다

  • 스레드의 속성
    • Name : 스레드의 명칭 지정
    • IsAlive : bool형 스레드가 살아있는지 죽었는지 확인
    • IsBackground
      • foreground : 주 스레드의 종료와 상관없이 독립적으로 작동하는 부 스레드
      • background : 주 스레드의 종료와 연계하여 같이 종료하는 부 스레드
      • public bool IsBackground {get; set; }
    • CurrentThread

기본 예제

namespace Thread_EX
{
    class Program
    {
        static void func()
        {
            int i = 0;
            while (true)
            {
                Console.Write($"{i++} ");
                Thread.Sleep(1000);
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(func));
            thread.Start();
            Console.WriteLine("Main 종료");
        }
    }
}

결과 값

main 스레드 가 종료되고 수가 계속 증가 하는 걸 볼 수 있다

그렇다면 위의 코드를 가지고 기본 속성을 다뤄 보자

IsBackground = true 사용

namespace Thread_EX
{
    class Program
    {
        static void func()
        {
            int i = 0;
            while (true)
            {
                Console.Write($"{i++} ");
                Thread.Sleep(1000);
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(func));
            thread.IsBackground = true;
            thread.Start();
            Console.WriteLine("Main 종료");
        }
    }
}

결과 값

IsBackground는 기본 값이 fales 이다

IsBackground = true 로 설정을 하게 되면 백 그라운드 스레드로 설정하겠다는 뜻이고 메인 스레드 가 종료되면 백 그라운드 스레드가 작업하던 수의 증가 출력을 상관없이 종료 시킨다

IsBackground 가 false 인 경우는 맨 처음 예제와 같이 메인 함수가 종료되어도 스레드는 종료 되지 않는다

CurrentThread

public static Thread CurrendThread{get;}

스레드는 독립된 아이디를 가진다

Thread.CurrentThread.GetHashCode()

namespace Thread_EX
{
    class Program
    {
        static void ThreadProc()
        {
            Console.WriteLine($"스레드 ID{Thread.CurrentThread.GetHashCode()}");
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(ThreadProc);

            thread.Start();
            Console.WriteLine($"메인 스레드 ID{Thread.CurrentThread.GetHashCode()}");
        }
    }
}

스레드 메서드

  • Start();
  • Join(); 스레드가 종료 될 때 까지 대기
namespace Thread_EX
{
    class Program
    {
        static void ThreadProc()
        {
            for (int i = 0; i < 10; i++) 
            {
                Console.Write($"{i}");
                Thread.Sleep( 200 );
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(ThreadProc));
            thread.Start();
            thread.Join(); // 위에 부 스레드가 끝날때 까지 메인종료 메세지( 주 스레드 ) 대기시킴
            Console.WriteLine("메인 종료");
        }
    }
}

  • Abort();
    • 이 함수를 호출한 곳의 현재 스레드를 중지
    • ThreadAbortException 예외 발생 try catch문 필요
    • CurrentThread.Abort();
namespace Thread_EX
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread th = new Thread(new ThreadStart(ThreadProc1));
            th.Start();

            Console.WriteLine($"Main 스레드 : {Thread.CurrentThread.GetHashCode}");
            Console.WriteLine("Main 종료");
        }
        private static void ThreadProc1()
        {
            Console.WriteLine($"ThreadProc1 아이디 : {Thread.CurrentThread.GetHashCode()}");
            Thread thread = new Thread(new ThreadStart(ThreadProc2));
            thread.Start();

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"{i * 10}");
                Thread.Sleep(200);
                if (i == 3)
                {
                    Console.WriteLine("ThreadProc1 종료");
                    Thread.CurrentThread.Abort();
                }
            }
        }
        private static void ThreadProc2()
        {
            Console.WriteLine($"ThreadProc2 아이디 : {Thread.CurrentThread.GetHashCode()}");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"{i}");
                Thread.Sleep(200);
            }
            Console.WriteLine("ThreadProc2 종료");
        }
    }
}

Abort() 를 사용 하면 스레드를 특정 부분에서 정지할 수 있다

  • 스레드의 속성
    • Name : 스레드의 명칭 지정
    • IsAlive : bool형 스레드가 살아있는지 죽었는지 확인
    • IsBackground
      • foreground : 주 스레드의 종료와 상관없이 독립적으로 작동하는 부 스레드
      • background : 주 스레드의 종료와 연계하여 같이 종료하는 부 스레드
      • public bool IsBackground {get; set; }
    • CurrentThread

기본 예제

namespace Thread_EX
{
    class Program
    {
        static void func()
        {
            int i = 0;
            while (true)
            {
                Console.Write($"{i++} ");
                Thread.Sleep(1000);
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(func));
            thread.Start();
            Console.WriteLine("Main 종료");
        }
    }
}

결과 값

main 스레드 가 종료되고 수가 계속 증가 하는 걸 볼 수 있다

그렇다면 위의 코드를 가지고 기본 속성을 다뤄 보자

IsBackground = true 사용

namespace Thread_EX
{
    class Program
    {
        static void func()
        {
            int i = 0;
            while (true)
            {
                Console.Write($"{i++} ");
                Thread.Sleep(1000);
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(func));
            thread.IsBackground = true;
            thread.Start();
            Console.WriteLine("Main 종료");
        }
    }
}

결과 값

IsBackground는 기본 값이 fales 이다

IsBackground = true 로 설정을 하게 되면 백 그라운드 스레드로 설정하겠다는 뜻이고 메인 스레드 가 종료되면 백 그라운드 스레드가 작업하던 수의 증가 출력을 상관없이 종료 시킨다

IsBackground 가 false 인 경우는 맨 처음 예제와 같이 메인 함수가 종료되어도 스레드는 종료 되지 않는다

CurrentThread

public static Thread CurrendThread{get;}

스레드는 독립된 아이디를 가진다

Thread.CurrentThread.GetHashCode()

namespace Thread_EX
{
    class Program
    {
        static void ThreadProc()
        {
            Console.WriteLine($"스레드 ID{Thread.CurrentThread.GetHashCode()}");
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(ThreadProc);

            thread.Start();
            Console.WriteLine($"메인 스레드 ID{Thread.CurrentThread.GetHashCode()}");
        }
    }
}

스레드 메서드

  • Start();
  • Join(); 스레드가 종료 될 때 까지 대기
namespace Thread_EX
{
    class Program
    {
        static void ThreadProc()
        {
            for (int i = 0; i < 10; i++) 
            {
                Console.Write($"{i}");
                Thread.Sleep( 200 );
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(ThreadProc));
            thread.Start();
            thread.Join(); // 위에 부 스레드가 끝날때 까지 메인종료 메세지( 주 스레드 ) 대기시킴
            Console.WriteLine("메인 종료");
        }
    }
}

  • Abort();
    • 이 함수를 호출한 곳의 현재 스레드를 중지
    • ThreadAbortException 예외 발생 try catch문 필요
    • CurrentThread.Abort();
namespace Thread_EX
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread th = new Thread(new ThreadStart(ThreadProc1));
            th.Start();

            Console.WriteLine($"Main 스레드 : {Thread.CurrentThread.GetHashCode}");
            Console.WriteLine("Main 종료");
        }
        private static void ThreadProc1()
        {
            Console.WriteLine($"ThreadProc1 아이디 : {Thread.CurrentThread.GetHashCode()}");
            Thread thread = new Thread(new ThreadStart(ThreadProc2));
            thread.Start();

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"{i * 10}");
                Thread.Sleep(200);
                if (i == 3)
                {
                    Console.WriteLine("ThreadProc1 종료");
                    Thread.CurrentThread.Abort();
                }
            }
        }
        private static void ThreadProc2()
        {
            Console.WriteLine($"ThreadProc2 아이디 : {Thread.CurrentThread.GetHashCode()}");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"{i}");
                Thread.Sleep(200);
            }
            Console.WriteLine("ThreadProc2 종료");
        }
    }
}

Abort() 를 사용 하면 스레드를 특정 부분에서 정지할 수 있다

  • 스레드의 속성
    • Name : 스레드의 명칭 지정
    • IsAlive : bool형 스레드가 살아있는지 죽었는지 확인
    • IsBackground
      • foreground : 주 스레드의 종료와 상관없이 독립적으로 작동하는 부 스레드
      • background : 주 스레드의 종료와 연계하여 같이 종료하는 부 스레드
      • public bool IsBackground {get; set; }
    • CurrentThread

기본 예제

namespace Thread_EX
{
    class Program
    {
        static void func()
        {
            int i = 0;
            while (true)
            {
                Console.Write($"{i++} ");
                Thread.Sleep(1000);
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(func));
            thread.Start();
            Console.WriteLine("Main 종료");
        }
    }
}

결과 값

main 스레드 가 종료되고 수가 계속 증가 하는 걸 볼 수 있다

그렇다면 위의 코드를 가지고 기본 속성을 다뤄 보자

IsBackground = true 사용

namespace Thread_EX
{
    class Program
    {
        static void func()
        {
            int i = 0;
            while (true)
            {
                Console.Write($"{i++} ");
                Thread.Sleep(1000);
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(func));
            thread.IsBackground = true;
            thread.Start();
            Console.WriteLine("Main 종료");
        }
    }
}

결과 값

IsBackground는 기본 값이 fales 이다

IsBackground = true 로 설정을 하게 되면 백 그라운드 스레드로 설정하겠다는 뜻이고 메인 스레드 가 종료되면 백 그라운드 스레드가 작업하던 수의 증가 출력을 상관없이 종료 시킨다

IsBackground 가 false 인 경우는 맨 처음 예제와 같이 메인 함수가 종료되어도 스레드는 종료 되지 않는다

CurrentThread

public static Thread CurrendThread{get;}

스레드는 독립된 아이디를 가진다

Thread.CurrentThread.GetHashCode()

namespace Thread_EX
{
    class Program
    {
        static void ThreadProc()
        {
            Console.WriteLine($"스레드 ID{Thread.CurrentThread.GetHashCode()}");
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(ThreadProc);

            thread.Start();
            Console.WriteLine($"메인 스레드 ID{Thread.CurrentThread.GetHashCode()}");
        }
    }
}

스레드 메서드

  • Start();
  • Join(); 스레드가 종료 될 때 까지 대기
namespace Thread_EX
{
    class Program
    {
        static void ThreadProc()
        {
            for (int i = 0; i < 10; i++) 
            {
                Console.Write($"{i}");
                Thread.Sleep( 200 );
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(ThreadProc));
            thread.Start();
            thread.Join(); // 위에 부 스레드가 끝날때 까지 메인종료 메세지( 주 스레드 ) 대기시킴
            Console.WriteLine("메인 종료");
        }
    }
}

  • Abort();
    • 이 함수를 호출한 곳의 현재 스레드를 중지
    • ThreadAbortException 예외 발생 try catch문 필요
    • CurrentThread.Abort();
namespace Thread_EX
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread th = new Thread(new ThreadStart(ThreadProc1));
            th.Start();

            Console.WriteLine($"Main 스레드 : {Thread.CurrentThread.GetHashCode}");
            Console.WriteLine("Main 종료");
        }
        private static void ThreadProc1()
        {
            Console.WriteLine($"ThreadProc1 아이디 : {Thread.CurrentThread.GetHashCode()}");
            Thread thread = new Thread(new ThreadStart(ThreadProc2));
            thread.Start();

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"{i * 10}");
                Thread.Sleep(200);
                if (i == 3)
                {
                    Console.WriteLine("ThreadProc1 종료");
                    Thread.CurrentThread.Abort();
                }
            }
        }
        private static void ThreadProc2()
        {
            Console.WriteLine($"ThreadProc2 아이디 : {Thread.CurrentThread.GetHashCode()}");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"{i}");
                Thread.Sleep(200);
            }
            Console.WriteLine("ThreadProc2 종료");
        }
    }
}

Abort() 를 사용 하면 스레드를 특정 부분에서 정지할 수 있다

  • 스레드의 속성
    • Name : 스레드의 명칭 지정
    • IsAlive : bool형 스레드가 살아있는지 죽었는지 확인
    • IsBackground
      • foreground : 주 스레드의 종료와 상관없이 독립적으로 작동하는 부 스레드
      • background : 주 스레드의 종료와 연계하여 같이 종료하는 부 스레드
      • public bool IsBackground {get; set; }
    • CurrentThread

기본 예제

namespace Thread_EX
{
    class Program
    {
        static void func()
        {
            int i = 0;
            while (true)
            {
                Console.Write($"{i++} ");
                Thread.Sleep(1000);
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(func));
            thread.Start();
            Console.WriteLine("Main 종료");
        }
    }
}

결과 값

main 스레드 가 종료되고 수가 계속 증가 하는 걸 볼 수 있다

그렇다면 위의 코드를 가지고 기본 속성을 다뤄 보자

IsBackground = true 사용

namespace Thread_EX
{
    class Program
    {
        static void func()
        {
            int i = 0;
            while (true)
            {
                Console.Write($"{i++} ");
                Thread.Sleep(1000);
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(func));
            thread.IsBackground = true;
            thread.Start();
            Console.WriteLine("Main 종료");
        }
    }
}

결과 값

IsBackground는 기본 값이 fales 이다

IsBackground = true 로 설정을 하게 되면 백 그라운드 스레드로 설정하겠다는 뜻이고 메인 스레드 가 종료되면 백 그라운드 스레드가 작업하던 수의 증가 출력을 상관없이 종료 시킨다

IsBackground 가 false 인 경우는 맨 처음 예제와 같이 메인 함수가 종료되어도 스레드는 종료 되지 않는다

CurrentThread

public static Thread CurrendThread{get;}

스레드는 독립된 아이디를 가진다

Thread.CurrentThread.GetHashCode()

namespace Thread_EX
{
    class Program
    {
        static void ThreadProc()
        {
            Console.WriteLine($"스레드 ID{Thread.CurrentThread.GetHashCode()}");
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(ThreadProc);

            thread.Start();
            Console.WriteLine($"메인 스레드 ID{Thread.CurrentThread.GetHashCode()}");
        }
    }
}

스레드 메서드

  • Start();
  • Join(); 스레드가 종료 될 때 까지 대기
namespace Thread_EX
{
    class Program
    {
        static void ThreadProc()
        {
            for (int i = 0; i < 10; i++) 
            {
                Console.Write($"{i}");
                Thread.Sleep( 200 );
            }
        }
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(ThreadProc));
            thread.Start();
            thread.Join(); // 위에 부 스레드가 끝날때 까지 메인종료 메세지( 주 스레드 ) 대기시킴
            Console.WriteLine("메인 종료");
        }
    }
}

  • Abort();
    • 이 함수를 호출한 곳의 현재 스레드를 중지
    • ThreadAbortException 예외 발생 try catch문 필요
    • CurrentThread.Abort();
namespace Thread_EX
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread th = new Thread(new ThreadStart(ThreadProc1));
            th.Start();

            Console.WriteLine($"Main 스레드 : {Thread.CurrentThread.GetHashCode}");
            Console.WriteLine("Main 종료");
        }
        private static void ThreadProc1()
        {
            Console.WriteLine($"ThreadProc1 아이디 : {Thread.CurrentThread.GetHashCode()}");
            Thread thread = new Thread(new ThreadStart(ThreadProc2));
            thread.Start();

            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"{i * 10}");
                Thread.Sleep(200);
                if (i == 3)
                {
                    Console.WriteLine("ThreadProc1 종료");
                    Thread.CurrentThread.Abort();
                }
            }
        }
        private static void ThreadProc2()
        {
            Console.WriteLine($"ThreadProc2 아이디 : {Thread.CurrentThread.GetHashCode()}");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"{i}");
                Thread.Sleep(200);
            }
            Console.WriteLine("ThreadProc2 종료");
        }
    }
}

Abort() 를 사용 하면 스레드를 특정 부분에서 정지할 수 있다

728x90
반응형

'개인 스터디' 카테고리의 다른 글

Monitor  (0) 2024.10.16
스핀락  (0) 2024.10.16
무명 메서드 (Anonymous Method)  (0) 2024.10.14
TCP 서버  (0) 2024.10.11
TCP 클라이언트  (0) 2024.10.11