Multi Thread(멀티 스레드)

장상희·2024년 12월 10일

1.스레드를 사용을 위해서 using System.Threading; 선언이 필요

void Start()
{
	Thread thread = Thread.CurrentThread;
	Debug.Log(thread.ThreadState)//스레드 현재 상태반환
}

스레드를 만들진 않았지만 유니티는 자동적으로 내부에 스레드가 있다는 걸 알수있다

Thread thread;

void Start()
{
	thread = new Thread(new ThreadStart(Temp));//ThreadStart=delegate
	thread.Start();
}

void Temp()
{
	Debug.Lof("스레드 시작");
	Debug.Log(thread.ThreadState);//현재 스레드 출력
	Thread.Sleep(2000);//2초 동안 스레드 중지
	Debug.Log("스레드 종료");
}

위 코드는 매개변수가 없는 함수를 호출 할떄는 이런방식으로 가능하다

만약 스레드로 호출하고 싶은 함수가 매개변수가 있으면

Thread thread;

void Start()
{
	thread = new Thread(new Parameter izedThreadStart(Temp))//파라미터가 있는 스레드를 실행시켜주는 무언가
	thread.Start(10);//매개 변수 인자를 넣어준다
}
void Tmep(object num)//오브젝트 타입
{
	Debug.Lof("스레드 시작");
	Debug.Log(thread.ThreadState);//현재 스레드 출력
	Thread.Sleep(2000);//2초 동안 스레드 중지
	Debug.Log(num);
	Debug.Log("스레드 종료");
}

이런식으로 메소드 참조가 가능하다 위 코드는 매개변수가 한 개 있는 걸 실행 시키는 방법이다

public class Param//클래스 생성
{
public int valuel;
public int value2;
}
Thread thread;
Unity 메시지 | 참조 0void Start()
{
}
thread = new Thread(new Parameter izedThreadStart (Temp));//매개변수 타입이 오브젝트 
//타입이기 떄문에 오브젝트 타입이면 어떤것도 매개변수로 할 수 있다 오브젝트 타입은 모든 자료형에 부모 타입이기때문에 어떤 것도 넣을 수 있다
Param param = new Param();//new 키워드와 사용자를 이용해 해당 클래스의 인스턴스를 만들고
// 그인스턴스에 내가 원하는 값을 각각 넣어 준다
param.value1 = 10;
param.value2 = 10;
thread.Start((object) param);//해당 인스턴스를 넘겨준다(알아 보기 쉽게 오브젝트를 넣어 줬지만 굳이 넣어줄 필요가 없다)
참조 1void Temp(object num)/나머지 내용은 달라진게 없다
{
Debug.Log("스레드 시작");
Debug.Log(thread. ThreadState);
Thread.Sleep(2000); //2초 동안 스레드 중지
Param param (Param) num;//다시 형변환 을 해주고 그 값을 알아보기 위해 믿에 두개의 Log를 출력했다
Debug.Log(param.value1);
Debug.Log(param.value2);
Debug.Log("스레드 종료");
}

매개변수가 여러 개 있는 건 이런 방식으로 가능하다

Thread.Sleep() : 현재 실행 중인 스레드를 지정한 시간(밀리초) 만큼 일시적으로 중지

2.Join 메서드에 대해서 알아보자


private Thread thread1, thread2;//스레드 두개 선언
Unity 메시지 | 참조 0void Start()
{
	thread1 = new Thread(Thread1Function);//new 스레드1 펑션해서 스레드1을 참조하고 있다
	thread1.Start();
	참조 1}

private void Thread1Function()//스레드 1을 실행하는 와중에 스레드 2까지 실행된다
{
	Debug.Log("Thread 1 시작");//스레드 1실행
	thread2 = new Thread(Thread2Function);//new 스레드2 펑션해서 스레드 2를 참조한다
	thread2.Start();
	thread2.Join();//여기서 부터 스레드 2가 완료될떄까지 대기를 한다
	Debug.Log("Join 완료.");
}

참조 1private void Thread2Function()
{
	Debug.Log("Thread 2 시작");
	Thread.Sleep(2000); // 2초 동안 스레드를 대기시킴
	Debug.Log("Thread 2 끝");
}
//실행 순서
//Thread 1 시작
//Thread 2 시작
//Join 완료
//Thread 2 끝

코드는 위에서 아래로 실행되기 떄문에 스레드 1이 먼저 실행되고 그다음 스레드2가 실행된다

하지만 이 코드는 “Join 완료” 보다 “Thread 2” 끝이 먼저 실행된다 그 이유는 Join 메서드 때문이다

Thread.Join() : 현재 스레드가 다른 스레드 작업이 끝날때까지 대기하도록 만듬

스레드 강제 종료 메서드

public class Test Thread9: MonoBehaviour
{
private Thread thread1;
Unity 메시지 | 참조 0void Start()
{
// 새로운 스레드 생성 및 시작
}
thread1 = new Thread(ThreadFunction);
thread1.Start();
참조 1void ThreadFunction()
{
	try // 예외가 발생할 수 있는 구문
	{
		Debug.Log("스레드 시작");
		Thread.Sleep(5000); // 5초 대기
		Debug.Log("스레드 종료");
	}
	catch (ThreadAbortException) //예외 발생 시 실행할 구문 1
	{
		Debug.Log("스레드 강제 종료.");
	}
	catch (ThreadInterruptedException) //예외 발생 시 실행할 구문2
	{
		Debug.Log("스레드 WaitSleepJoin");
	}
}
void UpdateO
{
// 일정 시간이 지난 후 스레드를 강제 종료
	if (Time.timeSinceLevel Load > 2f) // 예시로 2초 대기
	{
	thread1. Abort();
	}
}

try - catch : 예외 처리를 위한 C#구문

Abort() : ThreadAbort Exception 예외를 발생시키고 스레드를 종료

profile
프로그래머 꿈나무

0개의 댓글