프로그래밍/C#

[C#] 스레드 클래스 멤버

갓똥 2020. 5. 8. 17:08
728x90
반응형

1. Thread 클래스 멤버

using System;
using System.Threading;

class Program {
    public static void F1() {
        Console.WriteLine("F1 Start");
        Thread.Sleep(1000);
        Console.WriteLine("F1 End");
    }
    
    public static void Main() {
        Thread t1 = new Tread(F1);
        t1.Start();
        
        Console.WriteLine($"{t1.ManagedThreadID}");
        Console.WriteLine($"{t1.Priority}");
        Console.WriteLine($"{t1.IsThreadPoolThread}");
        Console.WriteLine($"{t1.IsAlive}");
    }
}

 

이번엔 스레드 클래스의 멤버에 대해 알아보자.

 ① Thread.ManagedThreadID

    => 스레드의 고유한 ID 값

 

 ② Thread.Priority

    => 스레드의 우선순위

    => 특별한 설정을 하지 않는 경우 Normal

 

 ③ Thread.IsThreadPoolThread

    => 현재 스레드가 스레드 풀에 있는 것이냐 조사

    => task로 만들었느냐 아니냐 조사

 

 ④ Thread.IsAlive

    => 현재 살아있는지 ( 동작중인지 )

 

using System;
using System.Threading;

class Program {
    public static void F1() {
        Console.WriteLine("F1 Start");
        Thread.Sleep(1000);
        Console.WriteLine("F1 End");
    }
    
    public static void Main() {
        Thread t1 = new Tread(F1);
        t1.Start();
        
        Console.WriteLine($"{t1.ManagedThreadID}");
        Console.WriteLine($"{t1.Priority}");
        Console.WriteLine($"{t1.IsThreadPoolThread}");
        Console.WriteLine($"{t1.IsAlive}");
        
        t1.IsBackGround = true;
        
        t1.Join();
    }
}

 

그 다음은 IsBackGround이다.
생각해볼게 위의 코드는 주 스레드가 먼저 끝나게 되고
새로 만든 스레드가 나중에 끝나게 된다.
이 때, 주 스레드가 끝나면 다른 스레드도 끝낼지, 다른 스레드의 동작이 끝날때까지 대기할지 정해야 한다.

이 때, IsBackGround를 따로 설정하지 않으면 끝날때까지 대기한다.
하지만 IsBackGround를 true로 놓게 되면 주스레드가 끝나면 다른 스레드도 강제로 죽게된다.

 ① ForeGround 스레드 : 주스레드가 종료 되어도 계속 작업 수행

 ② BackGround 스레드 : 주스레드가 종료 되면 강제 종료

 

 ③ Thread.Join()

    => 주스레드가 종료되어도 대기

 

using System;
using System.Threading;

class Program {
    public static void F1() {
        Thread t = Thread.CurrentThread;
        Console.WriteLine("F1 : "+t.ManagedThreadID);
    
        Console.WriteLine("F1 Start");
        Thread.Sleep(1000);
        Console.WriteLine("F1 End");
    }
    
    public static void Main() {
        Thread t1 = new Tread(F1);
        t1.Start();
        
        Console.WriteLine($"{t1.ManagedThreadID}");
        Console.WriteLine($"{t1.Priority}");
        Console.WriteLine($"{t1.IsThreadPoolThread}");
        Console.WriteLine($"{t1.IsAlive}");
        
        t1.IsBackGround = true;
    }
}

 

마지막으로 메소드 내부에서도 자신의 ID값을 출력하고 싶다면
Thread가 가지고 있는 속성 중 CurrentThread가 있다.
이것을 이용하면 메소드 내부에서도 자신의 ID값을 출력할 수 있다.
728x90
반응형