У меня есть простой Компьютер класс с 3 полями и Компьютеры класс, который имеет массив Computer [] и метод sortedAdd, который добавляет элементы во внутренний массив отсортированным образом.
В основном методе у меня есть массив computers , в котором есть все записи из файлов, которые я прочитал, и переменная results , в которую я пытаюсь добавить все записи, перебираякаждый Компьютеры объект класса в компьютеры * массив 1014 *.
В основном методе я хочу запустить выбранное количество потоков (2 <= количество <= 7) - что будетпереберите все имеющиеся у меня записи и добавьте каждую из них в результаты. Мой класс Компьютеры также должен быть поточно-ориентированным. </p>
Я пробовал это, и это, кажется, работает, но только если я использую 3 потока (это очевидно, потому что я назначаю один поток одному Компьютеру). объект).
public class Computers
{
public Computer[] _computers; //stores 'Computer' class objects.
private readonly object _locker;
public int _count { get; private set; } //element in array count
public Computers(int length)
{
_locker = new object();
_count = 0;
_computers = new Computer[length];
}
public void sortedAdd(Computer computer)
{
lock (_locker)
{
int indexToinsert = findIndex(computer); // find a spot where element should be added
if (indexToinsert == 0 && _count == 0 || indexToinsert == _count)
{
_computers[indexToinsert] = computer;
_count++;
}
else
{ //free up space for the element to be added.
for (int i = _count; i > indexToinsert; i--)
{
_computers[i] = _computers[i - 1];
}
_computers[indexToinsert] = computer;
_count++;
}
Monitor.Pulse(_locker);
}
}
public int findIndex(Computer computer)
{
if (_count == 0)
return 0;
for (int i = 0; i < _count; i++)
{
if (computer.CompareTo(_computers[i]) <= 0)
{
return i;
}
}
return _count;
}
}
static void Main(string[] args)
{
Computers[] computers = new Computers[3]; //data stored from 3 files.
Computers results = new Computers(90); // will store all elements here.
for (int i = 0; i < 3; i++)
computers[i] = ReadToArray(); //each Computers object's array Computer[] is populated with 30 records.
// --- now we take each element and add it to results.
var threadsAdd = Enumerable.Range(0, 3).Select(i => new Thread(() =>
{
for (int j = 0; j < computers[i]._computers.Length; j++)
{
results.sortedAdd(computers[i]._computers[j]);
}
}));
var threads = threadsAdd.ToList();
foreach (var thread in threads)
{
thread.Start();
}
// wait for all threads to finish
foreach (var thread in threads)
{
thread.Join();
}
}
Как мне сделать то же самое, но с .. например 2, 4 или 5 нитями вместо? Также мой поток компьютеров безопасен для потока?
Редактировать: Мне нужно использовать класс Thread специально и не разрешено использовать коллекции потока безопасности