Untitled
unknown
csharp
3 years ago
2.1 kB
102
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...