Wpis z mikrobloga

Jak w tych ebanych wątkach zrobić tak żeby rozwiązać problem konsumenta producenta (z rozmiarem 1) za pomocą BlockingQueue. Chodzi o taki wynik:

Produce 1
Consume 1
Produce 2
Consume 2
Produce 3
Consume 3

No i daje sobie np. SynchronizedQueue ale wtedy produkowane i pobierane są 2 naraz:

Produce 1
Produce 2
Consume 1
Consume 2
Produce 3
Produce 4
Consume 3
Consume 4

Jak to ograniczyć do 1 naraz? Jak daje ArrayBlockingQueue(1) to jest jeszcze gorzej :D
#pytanie #java #watki #programowanie
  • 7
@MrFisherman:

public static void main(String... args)
{

LinkedTransferQueue queue = new LinkedTransferQueue();

new Thread(() -> {

while(true) {
try
{
System.out.println("Consumer :: " + queue.take());
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}).start();

new Thread(() -> {

while(true) {
try
{
System.out.println("Producer");

queue.transfer("Object");
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}).start();

}

sorry ale nie wiem jak sie formatuje tutaj kod xd
@MrFisherman: wszystko jest dobrze. Consumer bierze zawartość z kolejki, więc jest tam pusto. Producer odrazu się budzi i wkłada nowy element jeszcze za nim Consumer wypisał wyciągniętą zawartość. Jak nie chcesz takiego zachowania to potrzebujesz dodatkowej synchronizacji albo czegoś innego niż BlockingQueue. Albo tak jak wyzej: dodaj sleepy
@Saly: mi tu raczej chodziło o wykorzystanie metody transfer, nie wczytywałem sie bardzo ani nie eksperymentowałem ale ona powinna zrobić to co chce @MrFisherman

/**
* Transfers the element to a consumer, waiting if necessary to do so.
*
* More precisely, transfers the specified element immediately
* if there exists a consumer already waiting to receive it (in
* {@link #take} or timed {@link #poll(long,TimeUnit) poll}),
* else