2016년 8월 23일 화요일

[C#강좌,닷넷강좌,IT실무교육★탑크리에듀][C#쓰레드예제]ThreadStart, ParameterizedThreadStart 예제

[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);

        }
    }
}

댓글 없음:

댓글 쓰기