[C#쓰레드예제]ThreadStart, ParameterizedThreadStart 예제
꽁스짱
C#
0
1008
2021.02.15 23:22
[C#쓰레드예제]ThreadStart, ParameterizedThreadStart 예제
1부터 100까지의 합을 10개의 쓰레드에 나누어서 실행하고자 한다.
첫번째 쓰레드는 1~10 까지의 합을, 두번째 쓰레드는 11~20 까지의 합을.... 아홉번째 쓰레드는
91~100 사이의 합을 구하는데 아래 두 방법으로 프로그램을 작성하세요.
- ParameterizedThreadStart 델리게이트를 이용하여 작성하세요.
- ThreadStart 델리게이트를 이용하여 작성하세요
ParameterizedThreadStart 델리게이트는 모양은 아래와 같다.
public delegate void ParameterizedThreadStart(object obj);
하나의 파라미터를 object 형식으로 전달하기 때문에 여러 개의 파라미터를 전달하기 위해서는 클래스나 구조체를 만들어 객체를 생성해서 전달할 수 있다.
파라미터의 전달은 Thread.Start() 메서드를 호출할 때 파라미터를 전달한다.
참고로 ThreadStart를 이용해 파라미터를 전달하는 방법은 일단 델리게이트 메서드는 파라미터를 받아들이지 않으므로 그 메서드 안에서 다른 메서드를 호출하면서 파라미터를 전달하는 방식을 사용할 수 있다.
1. ParameterizedThreadStart 델리게이트를 이용하여 작성
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication2
{
class Program
{
static int mysum = 0;
static void DoSomething(object n)
{
int sum = 0;
int[] number = (int[])n;
for (int i = number[0]; i <= number[1]; i++)
{
sum += i;
}
mysum += sum;
}
static void Main(string[] args)
{
Thread t1 = new Thread(new ParameterizedThreadStart(DoSomething));
Thread t2 = new Thread(new ParameterizedThreadStart(DoSomething));
Thread t3 = new Thread(new ParameterizedThreadStart(DoSomething));
Thread t4 = new Thread(new ParameterizedThreadStart(DoSomething));
Thread t5 = new Thread(new ParameterizedThreadStart(DoSomething));
Thread t6 = new Thread(new ParameterizedThreadStart(DoSomething));
Thread t7 = new Thread(new ParameterizedThreadStart(DoSomething));
Thread t8 = new Thread(new ParameterizedThreadStart(DoSomething));
Thread t9 = new Thread(new ParameterizedThreadStart(DoSomething));
Thread t10 = new Thread(new ParameterizedThreadStart(DoSomething));
t1.Start(new int[] { 1, 10 });
t2.Start(new int[] { 11, 20 });
t3.Start(new int[] { 21, 30 });
t4.Start(new int[] { 31, 40 });
t5.Start(new int[] { 41, 50 });
t6.Start(new int[] { 51, 60 });
t7.Start(new int[] { 61, 70 });
t8.Start(new int[] { 71, 80 });
t9.Start(new int[] { 81, 90 });
t10.Start(new int[] { 91, 100 });
t1.Join();
t2.Join();
t3.Join();
t4.Join();
t5.Join();
t6.Join();
t7.Join();
t8.Join();
t9.Join();
t10.Join();
Console.Write("1부터50까지의 합은{0}::", mysum);
}
}
}
2. ThreadStart 델리게이트를 이용하여 작성
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication3
{
class Program
{
static int mysum = 0;
static void Sum(object n)
{
int sum = 0;
int[] number = (int[])n;
for (int i = number[0]; i <= number[1]; i++)
{
sum += i;
}
mysum += sum;
}
static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(() => Sum(new int[] { 1, 10 })));
Thread t2 = new Thread(new ThreadStart(() => Sum(new int[] { 11, 20 })));
Thread t3 = new Thread(new ThreadStart(() => Sum(new int[] { 21, 30 })));
Thread t4 = new Thread(new ThreadStart(() => Sum(new int[] { 31, 40 })));
Thread t5 = new Thread(new ThreadStart(() => Sum(new int[] { 41, 50 })));
Thread t6 = new Thread(new ThreadStart(() => Sum(new int[] { 51, 60 })));
Thread t7 = new Thread(new ThreadStart(() => Sum(new int[] { 61, 70 })));
Thread t8 = new Thread(new ThreadStart(() => Sum(new int[] { 71, 80 })));
Thread t9 = new Thread(new ThreadStart(() => Sum(new int[] { 81, 90 })));
Thread t10 = new Thread(new ThreadStart(() => Sum(new int[] { 91, 100 })));
t1.Start(); t2.Start(); t3.Start(); t4.Start(); t5.Start();
t6.Start(); t7.Start(); t8.Start(); t9.Start(); t10.Start();
t1.Join(); t2.Join(); t3.Join(); t4.Join(); t5.Join();
t6.Join(); t7.Join(); t8.Join(); t9.Join(); t10.Join();
Console.WriteLine(mysum);
}
}
}