반응형
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);
}
반응형
'unity C#' 카테고리의 다른 글
[Unity] Hashtable > ArrayList > JsonData (0) | 2015.10.26 |
---|---|
[Unity] 리스트 재 정렬하기 list resorting (0) | 2015.10.26 |
[Unity] RectTransform anchor 스크립트상에서 변경하기. (0) | 2015.02.14 |
[Unity] sublime 연동하기 (0) | 2015.02.11 |
[Unity] Resources.load text json 파일 불러오기 (0) | 2015.02.04 |