Это на самом деле довольно легко с ожиданием () и notifyAll ().
Первый, определите объект блокирования. (Можно использовать любой класс для этого, но мне нравится быть явным):
package com.javadude.sample;
public class Lock {}
Затем, определяют Ваш рабочий поток. Он должен уведомить, что объект блокирования, когда он закончен со своей обработкой. Обратите внимание, что уведомление должно быть в синхронизируемом блоке, соединяющем объект блокирования.
package com.javadude.sample;
public class Worker extends Thread {
private Lock lock_;
private long timeToSleep_;
private String name_;
public Worker(Lock lock, String name, long timeToSleep) {
lock_ = lock;
timeToSleep_ = timeToSleep;
name_ = name;
}
@Override
public void run() {
// do real work -- using a sleep here to simulate work
try {
sleep(timeToSleep_);
} catch (InterruptedException e) {
interrupt();
}
System.out.println(name_ + " is done... notifying");
// notify whoever is waiting, in this case, the client
synchronized (lock_) {
lock_.notify();
}
}
}
Наконец, можно записать клиенту:
package com.javadude.sample;
public class Client {
public static void main(String[] args) {
Lock lock = new Lock();
Worker worker1 = new Worker(lock, "worker1", 15000);
Worker worker2 = new Worker(lock, "worker2", 10000);
Worker worker3 = new Worker(lock, "worker3", 5000);
Worker worker4 = new Worker(lock, "worker4", 20000);
boolean started = false;
int numNotifies = 0;
while (true) {
synchronized (lock) {
try {
if (!started) {
// need to do the start here so we grab the lock, just
// in case one of the threads is fast -- if we had done the
// starts outside the synchronized block, a fast thread could
// get to its notification *before* the client is waiting for it
worker1.start();
worker2.start();
worker3.start();
worker4.start();
started = true;
}
lock.wait();
} catch (InterruptedException e) {
break;
}
numNotifies++;
if (numNotifies == 4) {
break;
}
System.out.println("Notified!");
}
}
System.out.println("Everyone has notified me... I'm done");
}
}
Bazaar очень хорош для ваших нужд, и я сомневаюсь, что вы обнаружили проблемы со скоростью в ваших проектах. Bazaar имеет очень красивый интерфейс с графическим интерфейсом под названием Bazaar Explorer , который я бы рекомендовал вместо TortoiseBzr. (Bazaar Explorer теперь включен в стандартный установщик 2.0.)
Конечно, если вы выберете Mercurial, вы мало что потеряете.
Так что вам лучше протестировать одно и другое и сделать свой выбор. Каждый фанат порекомендует вам своего фаворита.
Если вы всего лишь один разработчик, работающий над небольшими проектами, любая система контроля версий должна быть достаточно быстрой.
Я сам разработчик Mercurial и, конечно, порекомендую это :-) Мне нравится, что в Mercurial есть одна центральная концепция: граф наборов изменений. Граф находится внутри репозитория (клона). В одном клоне может быть несколько линий развития. Это может быть несколько заголовков, возможно, отмеченных расширением закладок , или именованных ветвей. Вы также можете использовать несколько клонов, чтобы разделять вещи, или вы можете двигаться вперед и назад: легко отделить комбинированный клон (используйте hg clone -r REV
, чтобы получить часть графа ревизий). См. Эту запись в блоге для получения красивых картинок.
Для Windows (и других платформ тоже) у вас есть TortoiseHg , что дает вам очень красивый графический интерфейс. TortoiseHg также интегрируется со многими отличными плагинами для Mercurial, в частности, с расширением записи , которое позволяет вам выбирать отдельные изменения из файла при фиксации. Используя это, вы можете редактировать несколько файлов, а затем фиксировать эти изменения как несколько независимых ревизий.
Наконец, вы также должны знать о Mercurial: The Definitive Guide , бесплатной онлайн-книге о Mercurial.
Если вы пользователь Windows, ничто IMO не сможет победить TortoiseSVN с точки зрения удобства и простоты использования.
Определенно Subversion ....
Это бесплатно, очень-очень просто в настройке и использовании, не требует сервера, потому что он может просто получить доступ к локальной файловой системе, и вы можете найти масса документации и помощь, если вы застряли, потому что я думаю, что гораздо больше людей используют SVN, чем, например, bazaar или git ....
Вы можете просто загрузить TortoiseSVN ( http: // tortoisesvn. tigris.org/) ru начните его использовать .... Для начала больше ничего не требуется, потому что в tortoisesvn, как мне кажется, встроена функция Subversion ....
Я довольно широко использовал SVN, Git и Bzr в различных проектах. В настоящее время я использую Bzr в однопользовательском проекте, и его очень легко настроить и использовать. Нет необходимости настраивать сервер и поставляется с TortoiseBzr, который работает хорошо, он может быть не таким полным, как TortoiseSVN, но для проекта одного человека у вас должно быть все, что вам нужно. Не хватает нескольких вещей, таких как возможность пометить ревизию, и в этом случае вам нужно прибегнуть к использованию интерфейса командной строки. Я рассматривал Mercurial около года назад, но я еще не использовал его в реальной ситуации, поэтому я не смог бы сравнить. Я отказался от этого, потому что TortoiseHG в то время не казался очень зрелым, и я надеюсь, что с тех пор он будет улучшаться.
Я уже давно пользуюсь Bazaar, и мне это очень понравилось. Несмотря на всю шумиху вокруг git , я попробовал. И хотя у него довольно сложные концепции, я могу только сказать, что переход стоил того. Сейчас я использую его во всех своих проектах. Неважно насколько маленький. И я думаю, что TortoiseGit стал достаточно хорошим, чтобы его можно было использовать.
Я вижу в нем следующие положительные моменты:
Некоторые вещи мне не нравятся так сильно:
Мне очень нравится darcs , он использует так называемую теорию исправлений, которая, насколько мне известно, уникальна для программ управления версиями.
Я всегда буду рекомендовать Git. Это быстро, не требует сервера, отличное ветвление и слияние. Для Windows вам необходимо получить MsysGit .
Mercurial также очень хорош с немного более простым интерфейсом для пользователя.
Я поигрался со всеми из них.
Главное, что привлекло меня в Bazaar, - это его гибкость.
Хочу работать в централизованном режиме (аля SVN) ? Вы можете сделать это. Хотите работать в распределенном режиме (аля Mercurial или git)? Вы можете это сделать.
И вот что становится лучше: вы можете делать и то, и другое. Допустим, вы работаете с парнем, который пришел из SVN, и ему совсем немного не нравится распределенная концепция. Хорошо. Пусть он работает в централизованном режиме, а остальная команда работает в распределенном режиме. Если он находится вдали от центрального репозитория, он может даже отключить свою кассу и выполнять автономные коммиты, пока его нет. Затем он сможет зафиксировать их все, когда вернется.
Хотя в некоторых других системах есть способы приблизить различные модели,