반응형
출처 : http://www.wolfpack.pe.kr/123?category=2
1. Threading 사용하기
using UnityEngine; 
using System; 
using System.Threading;  

//쓰레드를 쓰겠다고 선언.  
public class ThreadOne : MonoBehaviour {      
    void Start(){         
        Debug.Log("카운트 0부터 49까지 세기!");         
        ThreadStart th = new ThreadStart(work); //1.work메소드를 위임.         
        Thread t = new Thread(th); //2.쓰레드생성.         
        t.Start(); //3.시작         
        Debug.Log("끝!");     
    }      
    
    public static void work(){         
        for (int i = 0; i<50; i++){             
            Debug.Log("Conut : " + i);         
        }     
    } 
} 
2. Threading 중지하기

쓰레드를 중지하기 위한방법은 2가지가 있음. Abort() : 강제 종료이며 어디에서 끝날지 모름. Join() : 쓰레드가 다 실행 될 때 까지 기다렸다가 종료.

using UnityEngine; 
using System; 
using System.Threading;  

public class ThreadOne : MonoBehaviour {      
    void Start(){         
        Debug.Log("카운트 0부터 1만까지 세기!");         
        ThreadStart th = new ThreadStart(work);         
        Thread t = new Thread(th);         
        t.Start(); //시작         
        t.Abort(); //강제종료         
        Debug.Log("끝!");     
    }      
    
    public static void work(){         
        for (int i = 0; i<10000; i++){             
            Debug.Log("Conut : " + i);         
        }     
    } 
} 

위 코드를 실행 시켰을 때 다음과 같은 출력을 보여준다.

 

Abort()로 종료 시키면 '0'까지 세고 끝이 날 때도 있고 '8'까지 세고 끝날 때도 있다.

 

반면 Join()으로 종료 시키면 다음과 같이 9999까지 출력 후 종료한다.

 

 

3.Threading 쉬게 하기

using UnityEngine; 
using System; 
using System.Threading;  

public class ThreadOne : MonoBehaviour {      
    void Start(){         
        Debug.Log("Start");         
        ThreadStart th = new ThreadStart(work);         
        Thread t = new Thread(th);         
        t.Start(); //시작         
        Debug.Log("end!");     
    }      
    
    public static void work(){         
        Thread.Sleep (100);         
        Debug.Log ("Sleep");     
    } 
} 

다시 살리는 명령어는 Thread.Resume()으로 하면 된다.

 

타원의 안은 상태 값, 화살표는 메소드를 나타낸다.

 
 
4.Multi Threading
using UnityEngine; 
using System.Collections; 
using System; 
using System.Threading;  

public class MultiThread : MonoBehaviour {          
    class Work{         
        int a;          
        
        public Work(int a){             
            a = a;         
        }          
        
        public void runit(){                          
            for(int i=0; i<10; i++){                 
                Debug.Log("Thread " + a + " Running : " + i);                 
                Thread.Sleep(100);             
            }         
        }
    }               
    
    void Start(){         
        Debug.Log ("start");         
        Work wk1 = new Work (1);         
        Work wk2 = new Work (2);         
        ThreadStart td1 = new ThreadStart (wk1.runit);         
        ThreadStart td2 = new ThreadStart (wk2.runit);         
        Thread t1 = new Thread (td1);         
        Thread t2 = new Thread (td2);         
        t1.Start ();         
        t2.Start ();      
    } 
} 

1번과 2번이 동시에 실행된다.

둘 중에 우선순위를 정하고자 할 때는 ThreadPriority 를 사용한다.

 
t1.Priority = ThreadPriority.Lowest; //1번 쓰레드 우선 순위 최하 
t2.Priority = ThreadPriority.Highest; //2번 쓰레드 우선 순위 최고 

 

멀티로 작업을 하다 보면 공통 변수로 작업해야 할 때가 있다. 이때 여러개의 쓰레드가 1개의 값을 건드리다 보면 값이 예상과 다르게 나올 수 가 있는데 이럴 땐 "lock"으로 묶어주거나 "Monitor.Enter()”와 "Monitor.Exit()”로 잡아줄 수 있다.

public void runit(){      	
    lock (this) { //또는 Monitor.Enter()        	
        for(int i=0; i<10; i++){       	
            Debug.Log("Thread " + a + " Running : " + i);            	
            Thread.Sleep(100);      	
        } 
    }//또는 Monitor.Exit(10); 
}  

 

반응형

+ Recent posts