Untitled

 avatar
unknown
csharp
2 years ago
2.1 kB
101
Indexable
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var workerCount = 10;
            var jobCount = 100;
            var workers = new List<Thread>();
            // Phân lô bán nền, tạo x job cho x thread đầu
            for (int i = 1; i <= workerCount; i++)
            {
                workers.Add(new Thread(DoWork));
                workers[i - 1].Name = i.ToString();
                workers[i - 1].Start(new MyClassForThread { ThreadIdx = i, WorkIdx = i }); // Thực thi & truyền params
            }
            // phân lô các job còn lại
            for (int i = workerCount + 1; i <= jobCount; i++)
            {
                // tìm thread free, nếu không thấy thì chờ đến khi có thread free
                var freeWorker = workers.FirstOrDefault(t => !t.IsAlive);
                while (freeWorker == null)
                {
                    freeWorker = workers.FirstOrDefault(t => !t.IsAlive);
                    Thread.Sleep(100);  // Tạm nghỉ để chờ worker hoàn thành job
                }

                // Không có khái niệm restart thread trong c#, xử lý bằng cách tạo mới thread ở vị trí của thread vừa hoàn thành
                var idx = workers.IndexOf(freeWorker);
                workers[idx] = new Thread(DoWork);
                workers[idx].Start(new MyClassForThread { ThreadIdx = idx+1, WorkIdx = i });
            }

            Console.WriteLine("\n==== DONE ====");
            Console.ReadKey();
        }

        public static void DoWork(object param)
        {
            var i = (MyClassForThread) param;
            var time = new Random().Next(1000, 10000);
            Console.WriteLine($"[START] Thread {i.ThreadIdx}, job {i.WorkIdx}");
            Thread.Sleep(time);
            Console.WriteLine($"[END] Thread {i.ThreadIdx}, job {i.WorkIdx} - {time}ms");
        }
    }
    class MyClassForThread
    {
        public int ThreadIdx { get; set; }
        public int WorkIdx { get; set; }
    }
}
Editor is loading...