Hi,
zum Besseren Verständnis des Semaphoren Prinzips habe ich ein kleines Producer, Consumer Beispiel geschrieben. Habe als ersten Ansatz die Beispielklasse Pool für mein Beispiel verwendet. Allerdings funktioniert es nicht richtig.
Eigentlich sollten beide Akteure abwechslend agieren. Wenn der Puffer leer ist, sollte der Consumer warten, wenn der Puffer voll ist der Producer. Die Synchronisation soll durch Verwendung von java.util.concurrent.Semaphore erreicht werden. Wie aber anhand der Ausgabe zu erkennen ist, arbeitet irgendwann nur noch der Producer nicht jedoch der Consumer.
LG Max
http://java.sun.com/javase/6/docs/api/java/util/concurrent/Semaphore.html
//Pool.java
// Producer.java
// Consumer.java
// Lunch.java
Ausgabe:
zum Besseren Verständnis des Semaphoren Prinzips habe ich ein kleines Producer, Consumer Beispiel geschrieben. Habe als ersten Ansatz die Beispielklasse Pool für mein Beispiel verwendet. Allerdings funktioniert es nicht richtig.
Eigentlich sollten beide Akteure abwechslend agieren. Wenn der Puffer leer ist, sollte der Consumer warten, wenn der Puffer voll ist der Producer. Die Synchronisation soll durch Verwendung von java.util.concurrent.Semaphore erreicht werden. Wie aber anhand der Ausgabe zu erkennen ist, arbeitet irgendwann nur noch der Producer nicht jedoch der Consumer.
LG Max
http://java.sun.com/javase/6/docs/api/java/util/concurrent/Semaphore.html
//Pool.java
Java:
import java.util.concurrent.Semaphore;
public class Pool {
private static final int MAX_AVAILABLE = 10;
private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);
protected Object[] items = new Object[MAX_AVAILABLE];
protected boolean[] used = new boolean[MAX_AVAILABLE];
public Pool() {
for (int i = 0; i < MAX_AVAILABLE; i++) {
items[i]= "Apfel";
}
}
public Object getItem() throws InterruptedException {
System.out.println("available.aquire() start");
available.acquire();
System.out.println("available.aquire() end");
return getNextAvailableItem();
}
public void putItem(Object x) {
if (markAsUnused(x)) {
System.out.println("available.release() start");
available.release();
System.out.println("available.release() end");
}
}
protected synchronized Object getNextAvailableItem() {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (!used[i]) {
used[i] = true;
return items[i];
}
}
return null;
}
protected synchronized boolean markAsUnused(Object item) {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (item == items[i]) {
if (used[i]) {
used[i] = false;
return true;
} else
return false;
}
}
return false;
}
}
// Producer.java
Java:
import java.util.Random;
public class Producer extends Thread{
private Pool pool;
private String[] fruit = {"apple", "pear", "strawberry"};
public Producer(Pool pool) {
this.pool = pool;
}
public void run(){
Random r = new Random();
while(true){
String s = fruit[r.nextInt(fruit.length)];
System.out.println("Producer put: " + s);
pool.putItem(s);
try {
Thread.sleep((long)r.nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// Consumer.java
Java:
import java.util.Random;
public class Consumer extends Thread{
private Pool pool;
private String[] fruit = {"apple", "pear", "strawberry"};
public Consumer(Pool pool) {
this.pool = pool;
}
public void run(){
Random r = new Random();
while(true){
try {
System.out.println("Consumer get and eat: " + pool.getItem().toString());
} catch (InterruptedException e1) {
e1.printStackTrace();
}
try {
Thread.sleep((long)r.nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// Lunch.java
Java:
public class Lunch {
public static void main(String[] args) {
Pool pool = new Pool();
Producer p = new Producer(pool);
Consumer c = new Consumer(pool);
c.start();
p.start();
}
}
Ausgabe:
Code:
available.aquire() start
available.aquire() end
Consumer get and eat: Apfel
Producer put: apple
available.aquire() start
available.aquire() end
Consumer get and eat: Apfel
available.aquire() start
available.aquire() end
Consumer get and eat: Apfel
available.aquire() start
available.aquire() end
Consumer get and eat: Apfel
Producer put: strawberry
available.aquire() start
available.aquire() end
Consumer get and eat: Apfel
available.aquire() start
available.aquire() end
Consumer get and eat: Apfel
Producer put: apple
available.aquire() start
available.aquire() end
Consumer get and eat: Apfel
available.aquire() start
available.aquire() end
Consumer get and eat: Apfel
Producer put: strawberry
available.aquire() start
available.aquire() end
Consumer get and eat: Apfel
Producer put: strawberry
available.aquire() start
available.aquire() end
Consumer get and eat: Apfel
Producer put: apple
available.aquire() start
Producer put: strawberry
Producer put: strawberry
Producer put: strawberry
Producer put: apple
Producer put: strawberry
Producer put: strawberry
Producer put: apple
Producer put: strawberry
Producer put: strawberry
Producer put: apple
Producer put: pear
Producer put: strawberry