java Exchanger 2

时间:2023-03-08 22:23:31
java Exchanger 2
//Listing 6-3. Using an Exchanger to Swap Buffers
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Exchanger; public class ExchangerDemo {
final static Exchanger<DataBuffer> exchanger = new Exchanger<DataBuffer>();
final static DataBuffer initialEmptyBuffer = new DataBuffer();
final static DataBuffer initialFullBuffer = new DataBuffer("I"); public static void main(String[] args) {
class FillingLoop implements Runnable {
int count = ; @Override
public void run() {
DataBuffer currentBuffer = initialEmptyBuffer;
try {
while (true) {
addToBuffer(currentBuffer);
if (currentBuffer.isFull()) {
System.out
.println("filling thread wants to exchange");
currentBuffer = exchanger.exchange(currentBuffer);
System.out
.println("filling thread receives exchange");
}
}
} catch (InterruptedException ie) {
System.out.println("filling thread interrupted");
}
} void addToBuffer(DataBuffer buffer) {
String item = "NI" + count++;
System.out.println("Adding: " + item);
buffer.add(item);
}
}
class EmptyingLoop implements Runnable {
@Override
public void run() {
DataBuffer currentBuffer = initialFullBuffer;
try {
while (true) {
takeFromBuffer(currentBuffer);
if (currentBuffer.isEmpty()) {
System.out.println("emptying thread wants to "
+ "exchange");
currentBuffer = exchanger.exchange(currentBuffer);
System.out.println("emptying thread receives "
+ "exchange");
}
}
} catch (InterruptedException ie) {
System.out.println("emptying thread interrupted");
}
} void takeFromBuffer(DataBuffer buffer) {
System.out.println("taking: " + buffer.remove());
}
}
new Thread(new EmptyingLoop()).start();
new Thread(new FillingLoop()).start();
}
} class DataBuffer {
private final static int MAXITEMS = ;
private final List<String> items = new ArrayList<>(); DataBuffer() {
} DataBuffer(String prefix) {
for (int i = ; i < MAXITEMS; i++) {
String item = prefix + i;
System.out.printf("Adding %s%n", item);
items.add(item);
}
} synchronized void add(String s) {
if (!isFull())
items.add(s);
} synchronized boolean isEmpty() {
return items.size() == ;
} synchronized boolean isFull() {
return items.size() == MAXITEMS;
} synchronized String remove() {
if (!isEmpty())
return items.remove();
return null;
}
}