Здесь я следовал кальке в методе ран в потоке. Думаю можно убрать while вместе с break нафиг.crypto5 wrote:А в чем смысл while(true) {...} ? Все равно получается возможна только одна итерация цикла?Sergunka wrote: Опа-на, точно лажанулся - уже исправил в блоге.
Ведение блога в ИТ
-
- Уже с Приветом
- Posts: 34124
- Joined: 03 Dec 2000 10:01
- Location: Vladivostok->San Francisco->Los Angeles->San Francisco
Re: Ведение блога в ИТ
"A patriot must always be ready to defend his country against his government." Edward Abbey
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Ведение блога в ИТ
Еще непонятно почему барбер закрывает офис если нету клиентов. По условиям задачи он вроде должен уснуть?..Sergunka wrote:Здесь я следовал кальке в методе ран в потоке. Думаю можно убрать while вместе с break нафиг.crypto5 wrote:А в чем смысл while(true) {...} ? Все равно получается возможна только одна итерация цикла?Sergunka wrote: Опа-на, точно лажанулся - уже исправил в блоге.
Еще обычно для барбера лучше юзать single thread executorservice с blocking queue внутри, и сабмитить в него клиентов как Runnable или Callable, всю логику барбера возьмет на себя ExecutorService
In vino Veritas!
-
- Уже с Приветом
- Posts: 34124
- Joined: 03 Dec 2000 10:01
- Location: Vladivostok->San Francisco->Los Angeles->San Francisco
Re: Ведение блога в ИТ
Офис закрывается если долгое время которое определяется в OFFICE_CLOSE нет клиента. Согласен комментарий не очень удачный сейчас перепишу, что мол де время ожидания клиента истекло и в зале ожидания никого нет.crypto5 wrote:Еще непонятно почему барбер закрывает офис если нету клиентов. По условиям задачи он вроде должен уснуть?..Sergunka wrote:Здесь я следовал кальке в методе ран в потоке. Думаю можно убрать while вместе с break нафиг.crypto5 wrote:А в чем смысл while(true) {...} ? Все равно получается возможна только одна итерация цикла?Sergunka wrote: Опа-на, точно лажанулся - уже исправил в блоге.
Code: Select all
Integer i = this.queue.poll(OFFICE_CLOSE, TimeUnit.MILLISECONDS);
if (i==null) break; // no more clients in the queue - close office
"A patriot must always be ready to defend his country against his government." Edward Abbey
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Ведение блога в ИТ
Да, это мелочь. А вот с ExecutorService лучше разобраться. У нас например в конторе сразу с тревогой смотрят на код, создающий свой собственный тред, так как высока вероятность что где то будут всякие сложно вылавлимые ошибки. А в случае с ExecutorService все надежнее, уже реализовано, и сложности спрятаны за удобным АПИ.
In vino Veritas!
-
- Уже с Приветом
- Posts: 34124
- Joined: 03 Dec 2000 10:01
- Location: Vladivostok->San Francisco->Los Angeles->San Francisco
Re: Ведение блога в ИТ
Здесь без вопросов в реальной имплементации лучше применить известный дизайн патерн тот же http://docs.oracle.com/javase/1.5.0/doc ... cutor.html с очередью с блокировкой сработает очень надежно.crypto5 wrote:Да, это мелочь. А вот с ExecutorService лучше разобраться. У нас например в конторе сразу с тревогой смотрят на код, создающий свой собственный тред, так как высока вероятность что где то будут всякие сложно вылавлимые ошибки. А в случае с ExecutorService все надежнее, уже реализовано, и сложности спрятаны за удобным АПИ.
Задача всеж на интервью состоит в том чтоб еще и покодить перед ашалевшей публикой
"A patriot must always be ready to defend his country against his government." Edward Abbey
-
- Уже с Приветом
- Posts: 9035
- Joined: 25 Oct 2011 19:02
- Location: SVO->ORD->SFO
Re: Ведение блога в ИТ
Ну если приходить на интервью со своими собственными вопросами, то публика действительно ошалеет. А сколько раз про barber'а спрашивали на интервью?Sergunka wrote: Задача всеж на интервью состоит в том чтоб еще и покодить перед ашалевшей публикой
-
- Уже с Приветом
- Posts: 34124
- Joined: 03 Dec 2000 10:01
- Location: Vladivostok->San Francisco->Los Angeles->San Francisco
Re: Ведение блога в ИТ
В той или иной форме всегда на интервью есть задачи по синхронизации. У меня был прикол два подряд интервью просили написать свою реальзацию очереди с блокировкой. На втором интервью я вроде как отписал нормально - получил офер.dotcom wrote:А сколько раз про barber'а спрашивали на интервью?
"A patriot must always be ready to defend his country against his government." Edward Abbey
-
- Уже с Приветом
- Posts: 4185
- Joined: 27 Apr 2011 03:43
- Location: Сергели ->Chicago
Re: Ведение блога в ИТ
в такой постановке, интересность задачи не тянет на блог для чувака за 150ка.Sergunka wrote: Согласен, что задача выполнена не по спекам как завещал Дейкстра
В моей интерпретации как в общем-то и в большинстве других на просторах интернета клиент заходит в зал ожидания (т.е. у меня в очередь с блокировкой) а потом уже парикмахер разбирается с ним. Здесь есть свои плюсы и минусы.
ну че там 2 метода: offer(), pull() и все решение !
у тебя клиент это не поток, а фактически сообщение которое поставили в очередь на обработку.
Задача дейкстры становится в разы интереснее если взглянуть на нее под другим углом.
Допустим что киенты, как и парикмакер - потоки.
Клиенты конкурируют за стул и время парикмакера и место в зале ожидания.
Парикмакер же за стул не конкурирует, но конкурирует за возможность поспать.
Вот тогда и начинается самое интересное.
Задача принимает нужную форму, клиенты-потоки идут спать и будятся, как только стул освободился.
Парикмакер наоборот идет спать если стул свободен и просыпается когда он становится занят.
-
- Новичок
- Posts: 73
- Joined: 28 Apr 2005 17:27
- Location: San Francisco Bay Area, CA
Re: Ведение блога в ИТ
а зачем вообще потоки и очереди в задаче про парикмахера?
Разве это не типичная задача для finite state machine? Нужен только один thread и заранее предсказуемое количество памяти для любого количества клиентов и парикмахеров.
Разве это не типичная задача для finite state machine? Нужен только один thread и заранее предсказуемое количество памяти для любого количества клиентов и парикмахеров.
-
- Уже с Приветом
- Posts: 4185
- Joined: 27 Apr 2011 03:43
- Location: Сергели ->Chicago
Re: Ведение блога в ИТ
предложите свое решение на java,ikatkov wrote:а зачем вообще потоки и очереди в задаче про парикмахера?
к слову сергей единственный кто это сделал, все остальные только умничают, включая меня
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Ведение блога в ИТ
Видимо потому что эту задачу так сформулировал Дейкстра, у него парикмахер и клиенты это разные процессы выполнения кода.ikatkov wrote:а зачем вообще потоки и очереди в задаче про парикмахера?
Разве это не типичная задача для finite state machine? Нужен только один thread и заранее предсказуемое количество памяти для любого количества клиентов и парикмахеров.
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Ведение блога в ИТ
В смысле? Вы никогда имплементацию не видели? Ну так гуглится на раз-два:valchkou wrote: предложите свое решение на java,
http://www.cs.helsinki.fi/u/kerola/rio/ ... arber.java
-
- Уже с Приветом
- Posts: 4185
- Joined: 27 Apr 2011 03:43
- Location: Сергели ->Chicago
Re: Ведение блога в ИТ
ну что так официально, нет я про привет конкретно, только сергей посмел выложить свою, хоть и кривую, но не постеснялся. У меня тоже был свой вариант, кстати таже с 3 семафорами, по типу вышеприведенного примера, с небольшими различиями, но я полинился разукрасить егоИнтеррапт wrote:В смысле? Вы никогда имплементацию не видели? Ну так гуглится на раз-два:valchkou wrote: предложите свое решение на java,
http://www.cs.helsinki.fi/u/kerola/rio/ ... arber.java
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Ведение блога в ИТ
Так и быть, выложу на досуге свой вариант с ForkJoinPool-омvalchkou wrote:ну что так официально, нет я про привет конкретно, только сергей посмел выложить свою, хоть и кривую, но не постеснялся. У меня тоже был свой вариант, кстати таже с 3 семафорами, по типу вышеприведенного примера, с небольшими различиями, но я полинился разукрасить егоИнтеррапт wrote:В смысле? Вы никогда имплементацию не видели? Ну так гуглится на раз-два:valchkou wrote: предложите свое решение на java,
http://www.cs.helsinki.fi/u/kerola/rio/ ... arber.java
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Ведение блога в ИТ
Ну а что вы хотели?valchkou wrote:ну что так официально
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Ведение блога в ИТ
Вот свой вариант набросал:
Code: Select all
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class Barber {
static ExecutorService barber = new ThreadPoolExecutor(
1,
1,
0,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(20),
new ThreadPoolExecutor.AbortPolicy());
public static void main(String args[]) {
for(int i = 0; i < 100; i ++) {
new Client().start();
}
}
static class Client extends Thread {
@Override
public void run() {
Future<Void> v = barber.submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
Thread.currentThread().sleep(1000);
return null;
}
});
try {
v.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
}
In vino Veritas!
-
- Уже с Приветом
- Posts: 4185
- Joined: 27 Apr 2011 03:43
- Location: Сергели ->Chicago
Re: Ведение блога в ИТ
хотел в гугл податься, но глянул на код крипто и понял, что нифига в жаве не рублю.Интеррапт wrote:Ну а что вы хотели?
крипто, почему твои варианты ответов не выгугливаются?
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Ведение блога в ИТ
Потому что я его 10 минут назад написал, эту страницу форума гугл видимо еще не успел проиндексироватьvalchkou wrote:хотел в гугл податься, но глянул на код крипто и понял, что нифига в жаве не рублю.Интеррапт wrote:Ну а что вы хотели?
крипто, почему твои варианты ответов не выгугливаются?
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Ведение блога в ИТ
Что-то вы там гугловцы тормозите. Когда же риал-тайм индексация будет?crypto5 wrote:Потому что я его 10 минут назад написал, эту страницу форума гугл видимо еще не успел проиндексировать
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Ведение блога в ИТ
Это не ко мне, я по части рекламыИнтеррапт wrote:Что-то вы там гугловцы тормозите. Когда же риал-тайм индексация будет?crypto5 wrote:Потому что я его 10 минут назад написал, эту страницу форума гугл видимо еще не успел проиндексировать
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Ведение блога в ИТ
Ну раз пошла такая пьянка, то и мы парикмахера напишем:
Code: Select all
class Barber:
event = threading.Event()
def cut_hair(self, customer):
print "CUSTOMER {}: haircut (begin)".format(customer.id)
self.event.clear()
time.sleep(AVG_HAIRCUT_TIME)
print "CUSTOMER {}: haircut (end)".format(customer.id)
def sleep(self):
self.event.wait()
def wake_up(self):
self.event.set()
class Customer:
id = None
def __init__(self, id):
self.id = id
class BarberShop:
barber = None
pending_customers = []
def __init__(self):
BarberShop.lock = threading.Lock()
self.barber = Barber()
th = threading.Thread(target=self.do_work)
th.start()
def do_work(self):
while True:
BarberShop.lock.acquire()
if len(self.pending_customers) > 0:
customer = self.pending_customers.pop(0)
BarberShop.lock.release()
self.barber.cut_hair(customer)
else:
BarberShop.lock.release()
print "BARBER: No customers, time to nap..."
self.barber.sleep()
print 'BARBER: New customer has arrived, wake up!'
def enter(self, customer):
BarberShop.lock.acquire()
print "CUSTOMER {}: entered a shop".format(customer.id)
if len(self.pending_customers) == NUMBER_OF_SEATS:
BarberShop.lock.release()
print "CUSTOMER {}: Wow, barber shop is full, I'm out of here!".format(customer.id)
else:
print "CUSTOMER {}: No worries, I'll wait".format(customer.id)
self.pending_customers.append(customer)
BarberShop.lock.release()
self.barber.wake_up()
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Ведение блога в ИТ
А вот если окажется что барберов 10, то мне нужно будет одну цифру поменять, а ты будешь плодить баги и дедлоки
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Ведение блога в ИТ
Просто тебе стыдно стало, что ты кучу потоков развел на ровном месте.crypto5 wrote:А вот если окажется что барберов 10, то мне нужно будет одну цифру поменять, а ты будешь плодить баги и дедлоки
-
- Уже с Приветом
- Posts: 4637
- Joined: 24 Oct 2009 01:38
- Location: Chicago ;-) -> SFBA!
Re: Ведение блога в ИТ
Столько же сколько и ты развелИнтеррапт wrote:Просто тебе стыдно стало, что ты кучу потоков развел на ровном месте. Джавис, что тут скажешь.crypto5 wrote:А вот если окажется что барберов 10, то мне нужно будет одну цифру поменять, а ты будешь плодить баги и дедлоки
In vino Veritas!
-
- Уже с Приветом
- Posts: 17281
- Joined: 07 Sep 2011 10:05
- Location: Seattle, WA
Re: Ведение блога в ИТ
Да я даже не про этот конкретный случай, а про F/J Pool c I/O операциямиcrypto5 wrote:Столько же сколько и ты развелИнтеррапт wrote:Просто тебе стыдно стало, что ты кучу потоков развел на ровном месте. Джавис, что тут скажешь.crypto5 wrote:А вот если окажется что барберов 10, то мне нужно будет одну цифру поменять, а ты будешь плодить баги и дедлоки