class Store
{
public synchronized method put (value)
{
while (@available == true) {
try {
System.Concurrent.Monitor.wait(self)
} else {
print(last_excp())
}
}
@seq = value
true^@available
System.Concurrent.Monitor.signal(self)
}
public synchronized method get ()
{
while (@available == false) {
try {
System.Concurrent.Monitor.wait(self)
} else {
print(last_excp())
}
}
false^@available
System.Concurrent.Monitor.signal(self)
@seq
}
method initialize ()
{
field @seq = 0
field @available =false
}
}
class Producer
{
method run ()
{
for (i; 0..9) {
@store.put(i)
print("Producer #" + @id + " put: " + i)
System.sleep(System.random(0,9) * 10)
}
}
public method start ()
{
thread = System.Concurrent.Thread.new(get_method("run"))
thread.start(self)
thread
}
method initialize (id, store)
{
field @id = id
field @store = store
}
}
class Consumer
{
method run ()
{
for (i; 0..9) {
value = @store.get()
print("Consumer #" + @id + " got: " + value)
}
}
public method start ()
{
thread = System.Concurrent.Thread.new(get_method("run"))
thread.start(self)
thread
}
method initialize (id, store)
{
field @id = id
field @store = store
}
}
method main ()
{
store = Store.new()
producer = Producer.new(1, store)
consumer = Consumer.new(1, store)
threads = Array.new()
threads.add(producer.start())
threads.add(consumer.start())
for (i,t; threads) {
t.join()
}
}
main()