C#

[C#] μ•ˆμ „ν•˜κ³  효율적인 μŠ€λ ˆλ“œ 생성 및 μ’…λ£Œ 방법

hyonie 2024. 6. 3. 00:44

C#μ—μ„œ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜κ³ , μ’…λ£Œν•˜λŠ” 방법에 λŒ€ν•΄ μ•Œμ•„λ³Έλ‹€. μŠ€λ ˆλ“œλŠ” ν”„λ‘œκ·Έλž¨μ—μ„œ μ—¬λŸ¬ μž‘μ—…μ„ λ™μ‹œμ— μ‹€ν–‰ν•  수 있게 ν•΄μ£ΌλŠ” μ€‘μš”ν•œ 도ꡬ이닀. 이 κΈ€μ—μ„œλŠ” μŠ€λ ˆλ“œλ₯Ό μ•ˆμ „ν•˜κ³  효율적으둜 μƒμ„±ν•˜κ³  μ’…λ£Œν•˜λŠ” 방법을 λ‹¨κ³„λ³„λ‘œ μ•Œμ•„λ³Έλ‹€. λ˜ν•œ μŠ€λ ˆλ“œκ°€ μžλ™μœΌλ‘œ μ’…λ£Œλ˜λ„λ‘ ν•˜λŠ” μ΅œμ„ μ˜ 방법에 λŒ€ν•΄μ„œλ„ μ‚΄νŽ΄λ³΄μž.

 

 


μŠ€λ ˆλ“œ μƒμ„±ν•˜κΈ°

Thread ν΄λž˜μŠ€λŠ” System.Threading λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ μ œκ³΅λ˜λŠ” 클래슀둜, μŠ€λ ˆλ“œμ˜ 생성, μ’…λ£Œ, 및 μ œμ–΄ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

이 클래슀λ₯Ό μ‚¬μš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ—μ„œ λ³‘λ ¬λ‘œ μ‹€ν–‰λ˜λŠ” μž‘μ—…μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€. μ£Όμš” κΈ°λŠ₯은 λ‹€μŒκ³Ό κ°™λ‹€.

  1. μŠ€λ ˆλ“œ 생성: μƒˆλ‘œμš΄ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜μ—¬ λ³‘λ ¬λ‘œ μ‹€ν–‰λ˜λŠ” μž‘μ—…μ„ μ‹œμž‘ν•  수 μžˆλ‹€.
  2. μŠ€λ ˆλ“œ μ’…λ£Œ: μŠ€λ ˆλ“œκ°€ μž‘μ—…μ„ μ™„λ£Œν•˜κ±°λ‚˜ 더 이상 ν•„μš”ν•˜μ§€ μ•Šμ„ λ•Œ μŠ€λ ˆλ“œλ₯Ό μ’…λ£Œν•  수 μžˆλ‹€.
  3. μŠ€λ ˆλ“œ μ œμ–΄: μŠ€λ ˆλ“œμ˜ μš°μ„ μˆœμœ„λ₯Ό μ„€μ •ν•˜κ±°λ‚˜, μΌμ‹œ μ€‘μ§€ν•˜κ±°λ‚˜ λ‹€μ‹œ μ‹œμž‘ν•˜κ±°λ‚˜, μŠ€λ ˆλ“œ κ°„ 톡신을 μœ„ν•œ 동기화 κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
public sealed class Thread

sealed ν‚€μ›Œλ“œκ°€ 클래슀 μ•žμ— λΆ™μ–΄ 있으면 ν•΄λ‹Ή ν΄λž˜μŠ€λŠ” 더 이상 λ‹€λ₯Έ ν΄λž˜μŠ€μ—κ²Œ 상속될 수 μ—†λ‹€. 즉, sealed ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ μƒμ†λ˜μ–΄ ν™•μž₯λ˜λŠ” 것을 λ°©μ§€ν•œλ‹€. λ”°λΌμ„œ sealed ν΄λž˜μŠ€λŠ” μ£Όμ–΄μ§„ ν˜•μ‹ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•΄μ•Όν•˜λ©°, μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜ λ³€κ²½ν• μˆ˜ μ—†λ‹€. μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨ 클래슀의 μ˜λ„λœ λ™μž‘μ΄λ‚˜ λ³΄μ•ˆμ„ 보닀 κ°•λ ₯ν•˜κ²Œ μœ μ§€ν•  수 μžˆλ‹€.

 

λ©”μ†Œλ“œ μ„€λͺ…
Abort() ν•΄λ‹Ή μŠ€λ ˆλ“œμ—μ„œ ThreadAbortException을 λ°œμƒμ‹œμΌœ μŠ€λ ˆλ“œλ₯Ό κ°•μ œ μ’…λ£Œν•œλ‹€. κΈ‰κ²©ν•œ μ’…λ£Œκ°€ μ΄λ€„μ§€λ―€λ‘œ μ•ˆμ „ν•˜μ§€ μ•Šκ³ , 예기치 μ•Šμ€ κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•  수 μžˆλ‹€. λ”°λΌμ„œ μ‚¬μš©μ„ ꢌμž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.
Join() νŠΉμ • μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•˜λ©΄μ„œ 호좜 μŠ€λ ˆλ“œλ₯Ό μ°¨λ‹¨ν•œλ‹€. 주둜 λΆ€λͺ¨ μŠ€λ ˆλ“œκ°€ μžμ‹ μŠ€λ ˆλ“œμ˜ μž‘μ—…μ΄ μ™„λ£Œλ˜κΈ°λ₯Ό 기닀릴 λ•Œ μ‚¬μš©λœλ‹€. μ•ˆμ „ν•˜κ²Œ μŠ€λ ˆλ“œλ₯Ό μ’…λ£Œν•˜κ³ μž ν• λ•Œ, μ‚¬μš©λœλ‹€.
Resume() μΌμ‹œ μ€‘μ§€λœ μŠ€λ ˆλ“œλ₯Ό λ‹€μ‹œ μ‹œμž‘ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μŠ€λ ˆλ“œλ₯Ό μΌμ‹œ μ€‘μ§€ν•œ λ’€ λ‹€μ‹œ μ‹œμž‘ν•˜λŠ”λ° μ‚¬μš©λ˜μ—ˆλ˜ λ©”μ„œλ“œμ΄λ‹€.
ν˜„μž¬λŠ” μ‚¬μš©λ˜μ§€ μ•ŠμœΌλ©°, λŒ€μ‹  μΌμ‹œ μ€‘μ§€λœ μŠ€λ ˆλ“œλ₯Ό λ‹€μ‹œ μ‹œμž‘ν•˜λ €λ©΄ λ‹€λ₯Έ λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•΄μ•Όν•œλ‹€.
Sleep() μ§€μ •λœ μ‹œκ°„λ™μ•ˆ ν˜„μž¬ μŠ€λ ˆλ“œλ₯Ό μΌμ‹œ μ€‘μ§€ν•œλ‹€. λ‹€λ₯Έ μŠ€λ ˆλ“œμ—κ²Œ μ œμ–΄λ₯Ό λ„˜κ²¨μ£Όμ–΄ λ‹€λ₯Έ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•œλ‹€. 주둜 μŠ€λ ˆλ“œμ˜ 싀행을 μΌμ‹œ μ€‘μ§€ν•˜κ³ , ꡐ착 μƒνƒœλ₯Ό λ°©μ§€ν•˜κ³ μž ν•  λ•Œ μ‚¬μš©λœλ‹€.
Start() ν˜„μž¬ μŠ€λ ˆλ“œ 객체λ₯Ό λ™μž‘(Running)μƒνƒœλ‘œ λ³€κ²½ν•˜μ—¬ μŠ€λ ˆλ“œλ₯Ό μ‹œμž‘ν•œλ‹€.
Suspend() ν˜„μž¬ λ™μž‘ν•˜κ³  μžˆλŠ” μŠ€λ ˆλ“œλ₯Ό μΌμ‹œ μ€‘μ§€ν•˜λŠ” λ©”μ„œλ“œμ΄μžλ§Œ, ν˜„μž¬λŠ” μ‚¬μš©λ˜μ§€ μ•ŠλŠ”λ‹€.

 

μŠ€λ ˆλ“œ 생성보닀 μ’…λ£Œκ°€ 더 μ–΄λ €μš΄λ°, μ•ˆμ „ν•œ μ’…λ£Œλ₯Ό μœ„ν•΄μ„  μ μ ˆν•œ 타이밍과 방법을 μ„ νƒν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.

 


ThreadStart 델리게이트

ThreadStart λΈλ¦¬κ²Œμ΄νŠΈλŠ” μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰ν•  λ©”μ„œλ“œλ₯Ό μ°Έμ‘°ν•  수 있게 ν•΄μ£ΌλŠ” C#μ—μ„œ μ‚¬μš©λ˜λŠ” λΈλ¦¬κ²Œμ΄νŠΈμ΄λ‹€. 이 λΈλ¦¬κ²Œμ΄νŠΈλŠ” νŠΉμ • λ©”μ„œλ“œμ˜ κΈ°λŠ₯을 λ‹€λ₯Έ μ½”λ“œ 블둝에 μœ„μž„ν•˜μ—¬ μ²˜λ¦¬ν•˜λŠ” 역할을 ν•œλ‹€.

public delegate void ThreadStart();

κ°„λ‹¨νžˆ λ§ν•˜λ©΄, ThreadStart λΈλ¦¬κ²Œμ΄νŠΈλŠ” μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  λ©”μ„œλ“œλ₯Ό μ§€μ •ν•˜κΈ° μœ„ν•œ μΌμ’…μ˜ 포인터 역할을 ν•œλ‹€. 이 λΈλ¦¬μΌ€μ΄νŠΈλ₯Ό μ‚¬μš©ν•˜λ©΄ μŠ€λ ˆλ“œλ₯Ό 생성할 λ•Œ μ‹€ν–‰ν•  λ©”μ„œλ“œλ₯Ό λͺ…ν™•ν•˜κ²Œ μ§€μ •ν•  수 μžˆλ‹€. 

 

λΈλ¦¬κ²Œμ΄νŠΈλŠ” C#μ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” κ°œλ…μ΄μ§€λ§Œ, λ¬Έλ²•μ μœΌλ‘œλŠ” λ‹€μ†Œ λ…νŠΉν•  수 μžˆλ‹€. νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ λ‹€λ₯Έ λ©”μ„œλ“œμ— λŒ€ν•œ μ°Έμ‘°λ₯Ό μ „λ‹¬ν•˜λŠ” μœ μš©ν•œ 방법이닀.

 

μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μΌν•œ λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•  λ•Œ ThreadStart 델리게이트λ₯Ό μ‚¬μš©ν•˜μ—¬ κ°„νŽΈν•˜κ²Œ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜κ³  κ΄€λ¦¬ν• μˆ˜ μžˆλ‹€.

 

 

 μŠ€λ ˆλ“œ μƒμ„±ν•˜κΈ°

ThreadStart ts = new ThreadStart(ThreadFunction);
Thread thd = new Thread(ts)
thd.Start();
  1. λ¨Όμ € Thread 클래슀의 객체λ₯Ό μƒμ„±ν•œλ‹€.
  2. μƒμ„±μžμ˜ μ „λ‹¬μΈμžλ‘œ ThreadStart 델리게이트λ₯Ό μ „λ‹¬ν•œλ‹€. μ΄λ•Œ, ThreadStart λΈλ¦¬κ²Œμ΄νŠΈλŠ” μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  λ©”μ„œλ“œλ₯Ό μ°Έμ‘°ν•œλ‹€. 예λ₯Ό λ“€μ–΄, `ThreadFuction`μ΄λΌλŠ” λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ `new ThreadStart(ThreadFunction)`κ³Ό 같이 μž‘μ„±ν•œλ‹€.
  3. μƒμ„±ν•œ Thread 객체λ₯Ό 톡해 μŠ€λ ˆλ“œλ₯Ό μ‹œμž‘ν•œλ‹€. 이λ₯Ό μœ„ν•΄ `Start()`λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€.

 

 

μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” κ³Όμ •

μŠ€λ ˆλ“œμ˜ μ‹€μ²΄λŠ” ν•¨μˆ˜μ΄λ‹€. μ—¬λŸ¬ μž‘μ—…μ„ λ™μ‹œμ— μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” ν•¨μˆ˜λ‘œ, μΌμ’…μ˜ νŠΉμ • κΈ°λŠ₯을 λ…λ¦½μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•΄μ€€λ‹€.

μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 과정을 κ°„λ‹¨νžˆ μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  1. μŠ€λ ˆλ“œ ν•¨μˆ˜ μ •μ˜: μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  ν•¨μˆ˜λ₯Ό μ •μ˜ν•œλ‹€. 이 ν•¨μˆ˜λŠ” μŠ€λ ˆλ“œκ°€ λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰ν•  μž‘μ—…μ„ ν¬ν•¨ν•œλ‹€.
  2. 델리게이트 생성: 델리게이트λ₯Ό μƒμ„±ν•˜μ—¬ μŠ€λ ˆλ“œ ν•¨μˆ˜λ₯Ό μ°Έμ‘°ν•œλ‹€. λΈλ¦¬κ²Œμ΄νŠΈλŠ” νŠΉμ • ν•¨μˆ˜μ˜ μ°Έμ‘°λ₯Ό μ €μž₯ν•˜λŠ”λ° μ‚¬μš©λœλ‹€.
  3. μŠ€λ ˆλ“œ 객체 생성: Thread 클래슀의 객체λ₯Ό μƒμ„±ν•œλ‹€. μ΄λ•Œ, μƒμ„±μžλ‘œ μŠ€λ ˆλ“œ ν•¨μˆ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” 델리게이트λ₯Ό μ „λ‹¬ν•œλ‹€.
  4. μŠ€λ ˆλ“œ μ‹œμž‘: μƒμ„±ν•œ μŠ€λ ˆλ“œ 객체의 Start() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μŠ€λ ˆλ“œλ₯Ό μ‹œμž‘ν•œλ‹€. 이λ₯Ό 톡해 μŠ€λ ˆλ“œκ°€ ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κ²Œ λœλ‹€.

 

μ΄λ ‡κ²Œ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜κ³ , μ‹€ν–‰ν•¨μœΌλ‘œμ¨ μ—¬λŸ¬ μž‘μ—…μ„ λ™μ‹œμ— μ²˜λ¦¬ν•  수 있게 λœλ‹€.

 


 

μŠ€λ ˆλ“œ μƒμ„±ν•˜κΈ°

메인 ν•¨μˆ˜κ°€ μ£Ό μŠ€λ ˆλ“œμ΄λ‹€. λ©”μΈν•¨μˆ˜κ°€ μ‹œμž‘λ˜λ©΄, μ£Ό μŠ€λ ˆλ“œκ°€ μ‹œμž‘λœκ²ƒμ΄λ‹€. λ©”μΈν•¨μˆ˜κ°€ μ’…λ£Œλ˜λ©΄, μ£Ό μŠ€λ ˆλ“œκ°€ μ’…λ£Œλœ μ‹œμ μ΄λ‹€. μ£Ό μŠ€λ ˆλ“œ μ•ˆμ—μ„œ ν•„μš”μ— μ˜ν•΄ μ›Œμ»€ μŠ€λ ˆλ“œλ₯Ό 생성할 수 μžˆλ‹€.

 

μŠ€λ ˆλ“œκ°€ 생성 및 λ™μž‘ν•˜λŠ” ꡬ쑰 πŸ”„οΈ

μ£Ό μŠ€λ ˆλ“œμ—μ„œ Thread.Start() ν•˜λ©΄ μƒˆλ‘œμš΄ μŠ€λ ˆλ“œκ°€ μƒμ„±λ˜κ³ , λ…λ¦½μ μœΌλ‘œ λŒμ•„κ°„λ‹€.

 

1. μŠ€λ ˆλ“œ ν•¨μˆ˜ λ§Œλ“€κΈ°

λ©”μΈμŠ€λ ˆλ“œμ™€ λ…λ¦½μ μœΌλ‘œ λ§Œλ“€μ–΄μ•Όν•˜λ‹ˆκΉŒ, μ™ΈλΆ€μ—μ„œ λ§Œλ“€λ©΄ λœλ‹€.

ThreadFunction() 은 μŠ€λ ˆλ“œ κΈ°λŠ₯이 λ˜λŠ” κ²ƒμœΌλ‘œ 보톡 μŠ€λ ˆλ“œλŠ” 반볡 μž‘μ—…μ„ ν•˜κΈ° λ•Œλ¬Έμ— λ¬΄ν•œ 루프λ₯Ό λ§Œλ“ λ‹€.

일반 μ½”λ“œμ—μ„œλŠ” 10번만 λŒλ¦¬λ„λ‘ν•˜κ² λ‹€.

public static void ThreadFunction()
{

    int count = 0;
    while(count < 10)
    {
        count++;
        Console.WriteLine("μŠ€λ ˆλ“œ λ™μž‘μ€‘...");
    }
}

 

2. 델리게이트둜 λ“±λ‘ν•˜κΈ°

μ—”νŠΈλ¦¬ ν¬μΈνŠΈκ°€ 메인이닀. 메인 μ•ˆμ—μ„œ λ§Œλ“€λ„λ‘ ν•œλ‹€. 이 델리게이트둜 ν•¨μˆ˜λ₯Ό λ“±λ‘ν•˜κ³ , 객체λ₯Ό μƒμ„±ν•œλ‹€.

tsλŠ” ThredStart 델리게이트 객체이닀. 이 λΈλ¦¬κ²Œμ΄νŠΈλŠ” μŠ€λ ˆλ“œ 클래슀이고의 μƒμ„±μžμ— μ „λ‹¬λ˜μ–΄, μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ν•  λ©”μ„œλ“œλ₯Ό μ§€μ •ν•œλ‹€.

 static void Main(string[] args)
 {
     Console.WriteLine("μ£Ό μŠ€λ ˆλ“œ μ‹œμž‘");
     // 2. 델리게이트둜 λ“±λ‘ν•˜κΈ°
     ThreadStart ts = new ThreadStart(ThreadFunction);

     // 3. μŠ€λ ˆλ“œ 객체생성
     Thread thd = new Thread(ts);

     Console.WriteLine("μ£Ό μŠ€λ ˆλ“œ μ’…λ£Œ");
 }

 

3. μŠ€λ ˆλ“œ 객체 생성

`Thred` ν΄λž˜μŠ€λŠ” seadled둜 μ„ μ–Έλ˜μ–΄ μžˆμ–΄ μƒμ†ν•˜μ§€ λͺ»ν•˜λ„둝 λ˜μ–΄μžˆλ‹€. 이 말은 `Thread`클래슀λ₯Ό μƒμ†ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀λ₯Ό λ§Œλ“€ 수 μ—†λ‹€λŠ” μ˜λ―Έμ΄λ‹€.

 

 

 

4. μŠ€λ ˆλ“œ μ‹œμž‘

thd.Start() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ›Œμ»€ μŠ€λ ˆλ“œλ₯Ό μ‹œμž‘ν•œλ‹€. μ›Œμ»€ μŠ€λ ˆλ“œ μƒνƒœκ°€ Running으둜 좜λ ₯λœλ‹€.

μ›Œμ»€ μŠ€λ ˆλ“œκ°€ μ‹œμž‘μ΄ λ˜μ—ˆλŠ”λ°, "μ£Ό μŠ€λ ˆλ“œ μ’…λ£Œ"λŠ” 메인이 μ’…λ£Œκ°€ λ˜μ—ˆλ‹€λŠ” κ²ƒμœΌλ‘œ μ£Ό μŠ€λ ˆλ“œλŠ” μ’…λ£Œλ˜μ—ˆμ§€λ§Œ

μ›Œμ»€μŠ€λ ˆλ“œλŠ” λ…λ¦½μ μœΌλ‘œ 계속 μ‹€ν–‰λœλ‹€. 

 static void Main(string[] args)
 {
     Console.WriteLine("μ£Ό μŠ€λ ˆλ“œ μ‹œμž‘");
     // 2. 델리게이트둜 λ“±λ‘ν•˜κΈ°
     ThreadStart ts = new ThreadStart(ThreadFunction);

     // 3. μŠ€λ ˆλ“œ 객체생성
     Thread thd = new Thread(ts);

     // 4. μŠ€λ ˆλ“œ μ‹œμž‘
     thd.Start();
     Console.WriteLine("μ›Œμ»€ μŠ€λ ˆλ“œ μ‹œμž‘: " + thd.ThreadState.ToString());
     Console.WriteLine("μ£Ό μŠ€λ ˆλ“œ μ’…λ£Œ");
 }

 

μ£Ό μŠ€λ ˆλ“œκ°€ μ’…λ£Œλ˜μ–΄λ„ μŠ€λ ˆλ“œλŠ” λ™μž‘μ€‘..λ‘κ°œμ˜ μŠ€λ ˆλ“œκ°€ λ…λ¦½μ μœΌλ‘œ λŒμ•„κ°€κ³  μžˆλ‹€λŠ” 것

 

λ™μ‹œμ— μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— μ‹œν€€μŠ€κ°€ μ„œλ‘œ λ§žμ§€ μ•Šλ‹€. λ™μ‹œμ— λŒμ•„κ°.


 

μŠ€λ ˆλ“œ μžλ™ μ’…λ£Œ

μŠ€λ ˆλ“œ μ’…λ£Œ μ‹œ κ°€μž₯ 쒋은 방법은 μžλ™μœΌλ‘œ μ’…λ£Œλ˜λ„λ‘ ν•˜λŠ” 것이닀. μ΄λŠ” κ°€μž₯ μ•ˆμ „ν•œ 방법이고, μŠ€λ ˆλ“œκ°€ μ •ν•΄μ§„ μž‘μ—…μ„ μ™„λ£Œν•˜λ©΄ 슀슀둜 μ’…λ£Œλ˜λŠ” ꡬ쑰λ₯Ό μ˜λ―Έν•œλ‹€. μžλ™ μ’…λ£ŒλŠ” μŠ€λ ˆλ“œκ°€ 10번 반볡 μž‘μ—…μ„ μˆ˜ν–‰ν•œ ν›„ μ•ˆμ „ν•˜κ²Œ μ’…λ£Œλ˜λŠ” 예제 처럼 μŠ€λ ˆλ“œκ°€ νŠΉμ • 쑰건을 λ§Œμ‘±ν•  λ•Œ μžμ—°μŠ€λŸ½κ²Œ μ’…λ£Œλ˜λ„λ‘ ν•˜λŠ”κ²ƒμ΄λ‹€. μ΄λŠ” μŠ€λ ˆλ“œλ₯Ό μ œμ–΄ν•˜κ±°λ‚˜ κ°•μ œλ‘œ μ’…λ£Œν•˜λŠ” 것보닀 일반적이고 ꢌμž₯λ˜λŠ” 방법이닀.

public static void ThreadFunction()
{
    int count = 0;
    while (count < 10)
    {
        // μ½”λ“œ
    }
}

 

 

 

 

 


 

μŠ€λ ˆλ“œ κ°•μ œ μ’…λ£Œ

μŠ€λ ˆλ“œλ₯Ό κ°•μ œλ‘œ μ’…λ£Œν•΄μ•Όν•  λ•Œκ°€ μžˆλ‹€. μŠ€λ ˆλ“œλ₯Ό μ™ΈλΆ€μ—μ„œ κ°•μ œ μ’…λ£Œν•΄μ•Ό ν•˜λŠ” 경우 Abort()λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. Abort()λ©”μ†Œλ“œκ°€ 호좜되면 λ‚΄λΆ€μ μœΌλ‘œ ThreadAbortException κ°•μ œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œμΌœ μ’…λ£Œν•œλ‹€. μ΄λŠ” ꢌμž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

public void Abort();

 

 

κ°•μ œ μ˜ˆμ™Έ μ’…λ£Œ

μ˜ˆμ™Έ μ’…λ£Œ μ‹œ Abortλ₯Ό μ‚¬μš©ν•΄μ„œ κ°•μ œ μ’…λ£Œλœλ‹€. try catch문으둜 ν™•μΈν•΄λ³΄μž.

κ°•μ œ μ’…λ£Œν•  λ•Œ 이런 μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλ‹€λŠ” 것. e. ν•˜λ©΄ κ΄€λ ¨ λ©”μ„Έμ§€ μ†ŒμŠ€λ₯Ό 좜λ ₯ν•  수 μžˆλ‹€. eλ₯Ό κ·ΈλŒ€λ‘œ 좜λ ₯ν•œλ‹€.

public static void ThreadFunction()
{
    // μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰ν•  μž‘μ—…

    try
    {
        int count = 0;
        while (count < 1000)
        {
            count++;
            Console.WriteLine("μŠ€λ ˆλ“œ λ™μž‘μ€‘...");
        }
    }
    catch (ThreadAbortException e)
    {
        Console.WriteLine("Abort μ˜ˆμ™Έ λ°œμƒ: " + e);
    }
    finally
    {
        Console.WriteLine("finally");
    }
   
}

 

λ©”μΈμ—μ„œ μ›Œμ»€μŠ€λ ˆλ“œλ₯Ό μ’…λ£Œλ₯Ό μ‹œμΌœλ³΄λ„λ‘ν•œλ‹€. Thread.Sleep(100) 0.1초 intervel을 μ€€λ‹€. κ°•μ œλ‘œ Abortν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.

1000번 μŠ€λ ˆλ“œ λ™μž‘μ„ 좜λ ₯ν•˜λ‹€κ°€ κ°•μ œ Abort() λ©”μ„œλ“œ 호좜되면 μŠ€λ ˆλ“œκ°€ μ€‘μ§€λœλ‹€.

 static void Main(string[] args)
 {
     Console.WriteLine("μ£Ό μŠ€λ ˆλ“œ μ‹œμž‘");
     // 2. 델리게이트둜 λ“±λ‘ν•˜κΈ°
     ThreadStart ts = new ThreadStart(ThreadFunction);

     // 3. μŠ€λ ˆλ“œ 객체생성
     Thread thd = new Thread(ts);

     // 4. μŠ€λ ˆλ“œ μ‹œμž‘
     thd.Start();
     Console.WriteLine("μ›Œμ»€ μŠ€λ ˆλ“œ μ‹œμž‘: " + thd.ThreadState.ToString());
     Console.WriteLine("μ£Ό μŠ€λ ˆλ“œ μ’…λ£Œ");
     Thread.Sleep(100);
     thd.Abort();
 }

μŠ€λ ˆλ“œλ₯Ό μ»¨νŠΈλ‘€ν•˜λŠ” λ‘œμ§μ—μ„œ κ°•μ œ μ’…λ£Œλ˜μ„œ catch문을 탄닀. μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•΄μ£Όκ³ , ThreadAbortException을 ν•΄μ£ΌλŠ” 것이 μ•ˆμ „ν•˜λ‹€.

 


 

μŠ€λ ˆλ“œμ˜ μš°μ•„ν•œ μ’…λ£Œ

μ•ˆμ •μ μœΌλ‘œ μŠ€λ ˆλ“œλ₯Ό 정상 μ’…λ£Œν•˜λŠ” 방법은 Join λ©”μ†Œλ“œ μ‚¬μš©ν•˜λ©΄ λœλ‹€. μŠ€λ ˆλ“œκ°€ λ‹€ 싀행될 λ•ŒκΉŒμ§€ κΈ°λ‹€λ Έλ‹€κ°€ μ’…λ£Œμ‹œν‚€λ―€λ‘œ 맀우 μ•ˆμ •μ μ΄λ‹€.

public void Join();

AbortλŠ” μ€€λΉ„λ˜μ§€μ•Šμ€ μƒνƒœμ—μ„œ κ°•μ œλ‘œ μ’…λ£Œν• λ•Œ μ‚¬μš©ν•˜κ³ , Join은 μŠ€λ ˆλ“œκ°€ λ‹€ μ‹€ν–‰λ λ•ŒκΉŒμ§€ 기닀렀쀬닀가 μ’…λ£Œν•œλ‹€.

C++μ—μ„œλŠ” κ°•μ œμ’…λ£Œ, μš°μ•„ν•œ μ’…λ£Œ μ²˜λ¦¬ν•˜λŠ” 것이 κΉŒλ‹€λ‘­λ‹€.

 

static void Main(string[] args)
{
    Console.WriteLine("μ£Ό μŠ€λ ˆλ“œ μ‹œμž‘");
    // 2. 델리게이트둜 λ“±λ‘ν•˜κΈ°
    ThreadStart ts = new ThreadStart(ThreadFunction);

    // 3. μŠ€λ ˆλ“œ 객체생성
    Thread thd = new Thread(ts);

    // 4. μŠ€λ ˆλ“œ μ‹œμž‘
    thd.Start();
    Console.WriteLine("μ›Œμ»€ μŠ€λ ˆλ“œ μ‹œμž‘: " + thd.ThreadState.ToString());
    Console.WriteLine("μ£Ό μŠ€λ ˆλ“œ μ’…λ£Œ");
    Thread.Sleep(100);
    thd.Join();
}

 

Abort()λ₯Ό μ‚¬μš©ν–ˆμ„ λ•ŒλŠ” 쀑간에 μ˜ˆμ™Έκ°€ λ°œμƒν—€λŠ”λ°, Join()은 μ’…λ£Œλ˜κΈ° μ „κΉŒμ§€ λκΉŒμ§€ κΈ°λ‹€λ €μ£Όκ³  정상 μ’…λ£Œκ°€ λœλ‹€. μŠ€λ ˆλ“œλ₯Ό μš°μ•„ν•˜κ²Œ μ’…λ£Œν•˜λŠ” 방법이닀.