|
|
От: |
romangr
|
|
| Дата: | 06.12.11 09:43 | ||
| Оценка: | |||
using System;
using System.Collections.Generic;
using System.Threading;
namespace Test
{
public enum Priority
{
Low,
Normal,
High
}
public interface ITask
{
void Execute();
}
public class FixedThreadPool
{
private const int THRESHOLD = 3;
private readonly Thread[] _threads;
private readonly Queue<ITask> _lowTasks = new Queue<ITask>();
private readonly Queue<ITask> _normalTasks = new Queue<ITask>();
private readonly Queue<ITask> _highTasks = new Queue<ITask>();
private readonly object _lock = new object();
private int _highTasksTaken;
private bool _stopped;
public FixedThreadPool(int threadCount)
{
_threads = new Thread[threadCount];
for (int i = 0; i < _threads.Length; i++)
{
var thread = new Thread(WorkerThreadProc);
_threads[i] = thread;
thread.Start();
}
}
public bool Execute(ITask task, Priority priority)
{
lock (_lock)
{
if (_stopped)
{
return false;
}
if (priority == Priority.High)
{
_highTasks.Enqueue(task);
}
else if (priority == Priority.Normal)
{
_normalTasks.Enqueue(task);
}
else
{
_lowTasks.Enqueue(task);
}
Monitor.Pulse(_lock);
}
return true;
}
public void Stop()
{
lock (_lock)
{
if (_stopped)
{
return;
}
_stopped = true;
Monitor.PulseAll(_lock);
}
foreach (var thread in _threads)
{
thread.Join();
}
}
private void WorkerThreadProc()
{
ITask currentTask;
while (true)
{
lock(_lock)
{
currentTask = GetTaskToExecute();
while (currentTask == null && !_stopped)
{
Monitor.Wait(_lock);
currentTask = GetTaskToExecute();
}
if (currentTask == null && _stopped)
{
return;
}
}
currentTask.Execute();
}
}
private ITask GetTaskToExecute()
{
if (_highTasks.Count > 0 && (_highTasksTaken < THRESHOLD || _normalTasks.Count == 0))
{
_highTasksTaken++;
if (_highTasksTaken > THRESHOLD)
{
_highTasksTaken = THRESHOLD;
}
return _highTasks.Dequeue();
}
else if (_normalTasks.Count > 0)
{
_highTasksTaken = 0;
return _normalTasks.Dequeue();
}
else if (_lowTasks.Count > 0)
{
return _lowTasks.Dequeue();
}
return null;
}
}
}|
|
От: | HowardLovekraft | |
| Дата: | 06.12.11 10:02 | ||
| Оценка: | |||
написание человеком своего пула потоков кажется особенно полезным, ага.Оба проекта являются клиент-серверными решениями и будут иметь более 5000 инсталляций фронта для продавцов на кассах, 100 инсталляций бэкофиса для бизнеса в офисе, 2-3 инсталляции серверной части
слабо верится вот в это:Все программисты решают все задачи: серверный код, GUI, работа с БД, интеграция с внешними системами, разработка юнит тестов, и так далее
В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых
|
|
От: | Divineshadow | |
| Дата: | 06.12.11 12:51 | ||
| Оценка: | |||
HL>слабо верится вот в это:HL>Все программисты решают все задачи: серверный код, GUI, работа с БД, интеграция с внешними системами, разработка юнит тестов, и так далее
HL>В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых
|
|
От: | Аноним | |
| Дата: | 30.01.12 18:05 | ||
| Оценка: | |||
HL>>слабо верится вот в это:HL>>Все программисты решают все задачи: серверный код, GUI, работа с БД, интеграция с внешними системами, разработка юнит тестов, и так далее
HL>>В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых
|
|
От: | Аноним | |
| Дата: | 30.01.12 18:12 | ||
| Оценка: |
|
||
HL>>слабо верится вот в это:HL>>Все программисты решают все задачи: серверный код, GUI, работа с БД, интеграция с внешними системами, разработка юнит тестов, и так далее
HL>>В нашем проекте нет плохих решений. Здесь не приходится копаться в плохо спроектированном коде и тратить время на ошибки, исправление которых неожиданно приводит к появлению новых
|
|
От: | Аноним | |
| Дата: | 21.02.12 09:51 | ||
| Оценка: | |||
|
|
От: |
IObserver
|
|
| Дата: | 21.02.12 21:07 | ||
| Оценка: | |||
|
|
От: |
AndrewVK
|
http://blogs.rsdn.org/avk |
| Дата: | 21.02.12 23:12 | ||
| Оценка: | +1 | ||
|
|
От: |
IObserver
|
|
| Дата: | 22.02.12 10:20 | ||
| Оценка: | |||