Я не знаком с GWT, но я очень знаком с Flex. Даже при том, что GWT основан на Java (и он кажется, что Вы - в основном магазин Java), я рекомендовал бы Flex на основе Ваших перечисленных интересов:
Futureproof - полномочия Flash YouTube и огромный процент мультимедиа в сети... они встроили его в игровые приставки, и Intel встраивает его в абонентские установки. Это будет здесь в течение долгого, долгого времени, и Adobe всегда поддерживал 100% назад совместимость с их Flash player.
Работы над всеми главными браузерами - да. И с Flash Player 10, который включает системы Linux также. И с очень минимальными администраторскими головными болями (путь меньше, чем Java, по-моему).
Быстрый & быстро реагирующий пользовательский опыт - да, хотя Java может быть быстрее в некоторых сценариях. Flash оптимизирован для векторного рендеринга, поэтому так как это - Ваша цель, это может быть, дают Вам лучшую производительность, чем Java.
Код должен быть тестируемой единицей - да, видеть FlexUnit.
Код должен быть удобным в сопровождении - определенно. AS3 является серьезным языком, не игрушечным языком сценариев. Это будет очень знакомо пользователям C# или Java.
Скорость & простота разработки - для того, что Вы делаете, Вы будете в состоянии найти десятки примеров точно, что Вы описали: изменение масштаба и панорамирование Google Maps - как векторные изображения. Ядро времени выполнения является хорошо разработанным графическим механизмом, так создание приложения интерактивных график является своей естественной тяжелой работой.
какая-то векторная графика Поддержек (SVG плюс) - очевидно, Flash делает это исходно. SVG поддерживается на этапе компиляции (можно скомпилировать в SVG, но Вы не можете проанализировать SVG во времени выполнения). Существуют наборы инструментальных средств, доступные, это преобразует SVG в SWF для Вас во времени выполнения.
[только 110] причина я видел бы использование GWT, должен будет сохранить Ваш Java магазина на сервере и клиенте..., но с другой стороны, Вы ищете лучшую технологию для задания, правильно? В этом случае я сказал бы, что Flash (и, в частности, платформа Flex) подходит лучше всего для того, что Вы желаете выполнить.
Конечно, есть очереди без блокировки. Однако, исходя из того, что вы сказали в комментариях, производительность здесь совсем не критична, поскольку вы в любом случае создаете поток для каждой записи.
Итак, это стандартный вариант использования переменной условия. Сделайте себе структуру, содержащую мьютекс, переменную условия, связанный список (или кольцевой буфер, если хотите) и флаг отмены:
write:
lock the mutex
(optionally - check the cancel flag to prevent leaks of stuff on the list)
add the event to the list
signal the condition variable
unlock the mutex
read:
lock the mutex
while (list is empty AND cancel is false):
wait on the condition variable with the mutex
if cancel is false: // or "if list non-empty", depending on cancel semantics
remove an event from the list
unlock the mutex
return event if we have one, else NULL meaning "cancelled"
cancel:
lock the mutex
set the cancel flag
(optionally - dispose of anything on the list, since the reader will quit)
signal the condition variable
unlock the mutex
Если вы используете список с внешними узлами, тогда вы можете выделить память за пределами блокировки мьютекса, просто чтобы сократить время ее удержания. Но если вы разрабатываете события с помощью навязчивого узла списка, это, вероятно, проще всего.
Изменить: вы также можете поддерживать несколько считывателей (без переносимых гарантий, для которых одно событие получает данное событие), если в отмене вы измените "сигнал" на " трансляция ". Хотя вам это и не нужно, на самом деле это тоже ничего не стоит.
Я бы выбрал несколько очередей с одним устройством записи (по одной на каждый поток записи). Затем вы можете проверить этот , чтобы узнать, как заставить отдельный считыватель читать различные очереди.
Если вам не нужна очередь, свободная от блокировок, вы можете просто закрыть существующую очередь блокировкой.
Mutex myQueueLock;
Queue myQueue;
void mtQueuePush(int value)
{
lock(myQueueLock);
queuePush(myQueue, value);
unlock(myQueueLock);
}
int mtQueueNext()
{
lock(myQueueLock);
int value = queueFront(myQueue);
queuePop(myQueue);
unlock(myQueueLock);
return value;
}
Единственное, что после этого, - это добавить некоторую обработку для mtQueueNext, когда очередь пуста.
РЕДАКТИРОВАТЬ: Если у вас есть одиночный читатель, безблокирующая очередь с одним писателем, вам нужна только блокировка вокруг mtQueuePush, чтобы предотвратить одновременную запись нескольких писателей.
Существует множество одиночных безблокирующих очередей считывателя / писателя, хотя большинство из них реализовано как классы шаблонов c ++. Однако выполните поиск в Google и при необходимости подумайте, как их переписать на обычном языке C.