Poznaj sposób implementacji jednego z klasycznych problemów współbieżności w Javie.
- W tym przykładzie producent umieszcza elementy w kolejce, a konsument je pobiera.
- Kolejka blokująca - BlockingQueue - zapewnia, iż producent się blokuje (czeka) gdy kolejka jest pełna, a konsument gdy kolejka jest pusta.
- To zapewnia, iż producent i konsument nie próbują dodawać lub usuwać elementów z kolejki w tym samym czasie.
- Co chroni nas przed warunkami wyścigu - race condition.
public
class
ProducerConsumerExample
{
public
static
void
main(String[]
args)
{
// kolejka blokująca z 10 elementami
BlockingQueue<Integer>
queue
=
new
ArrayBlockingQueue<>(10);
// utworzenie producenta i konsumenta
Producer
producer
=
new
Producer(queue);
Consumer
consumer
=
new
Consumer(queue);
// wystartowanie wątków
new
Thread(producer).start();
new
Thread(consumer).start();
}
}
class
Producer
implements
Runnable
{
private
BlockingQueue<Integer>
queue;
public
Producer(BlockingQueue<Integer>
queue)
{
this.queue
=
queue;
}
public
void
run()
{
try
{
for
(int
i
=
0;
i
<
100;
++i)
{
// Wrzuć element na kolejkę
queue.put(i);
System.out.println("Produced: "
+
i);
}
}
catch
(InterruptedException
e)
{
e.printStackTrace();
}
}
}
class
Consumer
implements
Runnable
{
private
BlockingQueue<Integer>
queue;
public
Consumer(BlockingQueue<Integer>
queue)
{
this.queue
=
queue;
}
public
void
run()
{
try
{
for(int
i
=
0;
i
<
100;
++i)
{
// Pobierz element z kolejki
int
item
=
queue.take();
System.out.println("Consumed: "
+
item);
}
}
catch
(InterruptedException
e)
{
e.printStackTrace();
}
}
}
Oraz wynik z działania programu.
Produced: 0
Consumed: 0
Produced: 1
Consumed: 1
Produced: 2
Consumed: 2
Produced: 3
Consumed: 3
Produced: 4
Consumed: 4
Produced: 5
Consumed: 5
Produced: 6
Consumed: 6
Produced: 7
Consumed: 7
Produced: 8
Consumed: 8
Produced: 9
Consumed: 9
Produced: 10
Consumed: 10
Produced: 11
Consumed: 11
Produced: 12
Consumed: 12
Produced: 13
Consumed: 13
Produced: 14
Consumed: 14
Consumed: 15
Produced: 15
Produced: 16
Produced: 17
Produced: 18
Produced: 19
Consumed: 16
Consumed: 17
Consumed: 18
Consumed: 19