본문 바로가기
[ Program ]/c#스터디

51. 쓰레드1(Thread)

by 관이119 2022. 2. 4.

피씨는 한번에 여러일을 하는거처럼 사용할 수 있다.

예를 들면 노래를 들으면서 인터넷서핑을 하거나 파일을 다운로드 받으면서 영상을 보거나 하는것들이 있을수 있다.

이렇게 여러가지 작업들을 동시에 수행하는것은 실제로 여러가지를 한번에 동시에 수행하는것이 아니라 하나를 잠시작업하고 아주짧은시간뒤에 다른걸 또 작업하고 이렇게 여러개를 조금씩 계속 실행하는것이다.

 

다시 설명하면  한 가지 일을 하다가, 잠시 멈추고 또 다른 일을 하고, 또 멈추고 다른 일을 하다 보면 언젠가는 결국 모든 일을 마치게 된다. 이 동작이 엄청 빨라지면 한 번에 여러가지 일을 하는 것처럼 보이게 되는 것이다.

 

이작업을 멀티태스킹이라고 하는데 쓰레드는 다른작업을 시작하게 해주는 역할을 한다.

아래 그림을 보자.

 

그림1

 

그림1을 보면 메인작업 진행중 갈라진 화살표가 보인다.

그화살표작업들을 시작하게 해주는것이 쓰레드라고 생각하면 된다.

멀티쓰레드, 멀티태스킹 등 단어가 다르긴한데 둘다 같은의미라고 생각하면된다.

 

 

그림2

 

그림2를 보면 가장기본적인 쓰레드 형태의 예제를 만들어놨다. 

Thread 에서 우클릭하여 자동으로 참조추가하면 System.Threading 이 추가될것이다.(직접추가해도 된다.)

 

Thread 가 핵심 인데  Start() 함수로 해당쓰레드를 시작할수 있다.

그냥 실행할수는 없고 파라미터로 받는것들이 ParameterizedThreadStart , ThreadStart 인데 둘중 ThreadStart 로 먼저 예제를 만들어봤다.

이경우 ThreadStart ts = new ThreadStart(threadfunc); 처럼 새객체로 만들어주면 되는데 파라미터로 받는 인자가 void 형태의 함수이다.

그래서 파라미터로 threadfunc 함수명을 넘겨주면  프로그램이 실행되면 메인 쓰레드에서 Test1 팝업을 띄우고 새로 실행한 쓰레드에서 Test2 팝업을 띄워서 결론적으로 프로그램 실행시 Test1 과 Test2 팝업이 뜨게 된다.

물론 처리시간이 아주 짧기 때문에 프로그램 실행과 동시에 팝업은 둘다 떠서 따로 실행됐다고 인지 하기는 힘들것이다.

 

쓰레드는 자신이 작업해야할 내용이 종료되면 자동 종료 되는데 위예제의 경우 threadfunc 함수에서 Test2 팝업을 출력하고 해당 쓰레드는 자동으로 종료된다.

 

위의 예제를 조금 수정해서 인지 할수 있게 바꿔보자.

 

그림3

 

그림3을 보면 threadfunc 함수내에 Thread.Sleep(1000); 을 입력해놨다.

Sleep 함수는 속해있는 쓰레드의 진행을 지정시간동안 정지 시키는 함수다.

ms 이기때문에 1000 을 넣으면 실제로 1초를 정지 하게 된다.

결국 위 예제를 실행하면 Test1 이 팝업이 뜨고 1초뒤에 Test2 팝업이 뜨게 된다.

 

 

그림4

 

그림4는 그림3의 실제 작동모습을 형상화한 내용이다.

동그라미가 버튼을 클릭한 시점이고 저시점에 Test1 팝업창이 뜨고, 새로운 쓰레드를 시작시켰다.

그리고 새로운 쓰레드는 1초 슬립한뒤에 Test2 팝업창을 띄우고 스스로 종료 되게 된다.

 

어느정도 이해가 됐으리라고 생각한다.

 

그림5

 

그림5에는 ParameterizedThreadStart 를 사용하는 예제를 올려놨다.

사용법은 거의 ThreadStart 와 동일한데 쓰레드에 파라미터를 Object 로 전달할수 있다는 점이 다르다.

Object 면 당연히 String,int 외에도 배열이나 클래스까지 전달할 수 있다.

위 예제에서

ParameterizedThreadStart ps = new ParameterizedThreadStart(threadfunc);
Thread t = new Thread(ps);
t.Start(2);

이부분을 보면 threadfunc 함수를 호출하면서 쓰레드가 시작될때 2를 넘기고 있다.

그리고 threadfunc 함수에서는 그파라미터를 받아 출력할때 사용하고 있다.

결론적으로 그림5 예제도 Test1 팝업창이 뜨고 1초뒤에 Test2 팝업창이 뜨게 된다.

 

쓰레드 옵션에 보면 다음과 같은 옵션이 있다.

Thread t = new Thread(ps);
t.IsBackground = false;
t.Start(2);

IsBackground 는 true 와 false 두가지를 지정할 수 있는데 차이점은 true 로 할경우 메인쓰레드가 종료되면 새로 생성한 쓰레드도 작업완료여부와 상관없이 같이 종료된다.

false 로 할경우는 메인쓰레드와 상관없이 자신의 작업이 끝나고나서 종료된다.

즉,프로그램이 끝나면 바로 쓰레드를 종료시킬지 아니면 프로그램이 끝나도 쓰레드에서 작업이 끝나고 종료 될지 판단후 사용해야 한다.

예를 들어 어떤 프로그램에서 사용자가 설정한 최종값이 어떻게든 저장되어야 한다면 IsBackground 를 true 상태로 두고 거기서 설정저장 작업을 완료 한다면 프로그램 종료 여부와 상관없이 설정이 전부 정상저장되고 해당쓰레드가 종료 되게 될것이다.

 

 

***숙제 : 1~100 까지의 숫자중 짝수의 합과 홀수의 합을 각각 쓰레드에서 합계를 출력하게 해보자.

'[ Program ] > c#스터디' 카테고리의 다른 글

53. 무명메서드  (0) 2022.02.08
52. 델리게이트  (0) 2022.02.05
50. 전처리기 / 편의사항  (0) 2021.10.29
49. 디버깅  (0) 2021.10.09
48. 계산기 만들기  (0) 2021.10.09

댓글