import java.util.Vector;
class Test {
private Vector<String> mCache = new Vector<String>();
static class Consumer implements Runnable {
private Test mTestRef;
Consumer(Test t) {
mTestRef = t;
}
public void run() {
try {
for (; ;) {
synchronized (mTestRef) {
if (mTestRef.mCache.size() > 0) {
String item = mTestRef.mCache.get(0);
mTestRef.mCache.remove(0);
System.out.println("Consume the item: " + item);
} else {
mTestRef.wait();
}
}
}
}
catch (InterruptedException ex) {
}
}
}
static class Producer implements Runnable {
private Test mTestRef;
private String mProducerId;
Producer(String id, Test t) {
mProducerId = id;
mTestRef = t;
}
public void run() {
try {
int i = 0;
while ((++i)<5) {
synchronized (mTestRef) {
String item = mProducerId + " #" + i;
mTestRef.mCache.add(item);
mTestRef.notify();
}
Thread.sleep(1000);
}
}
catch (InterruptedException ex) {
}
}
}
public static void main(String[] args) {
Test test = new Test();
Thread consumer = new Thread(new Consumer(test));
Thread producer1 = new Thread(new Producer("p1", test));
Thread producer2 = new Thread(new Producer("p2", test));
producer1.start();
producer2.start();
consumer.start();
try {
Thread.sleep(15000);
producer1.interrupt();
producer2.interrupt();
consumer.interrupt();
producer1.join();
producer2.join();
consumer.join();
}
catch (Exception e) {
System.out.println("exception: " + e.getMessage());
}
}
}
class Test {
private Vector<String> mCache = new Vector<String>();
static class Consumer implements Runnable {
private Test mTestRef;
Consumer(Test t) {
mTestRef = t;
}
public void run() {
try {
for (; ;) {
synchronized (mTestRef) {
if (mTestRef.mCache.size() > 0) {
String item = mTestRef.mCache.get(0);
mTestRef.mCache.remove(0);
System.out.println("Consume the item: " + item);
} else {
mTestRef.wait();
}
}
}
}
catch (InterruptedException ex) {
}
}
}
static class Producer implements Runnable {
private Test mTestRef;
private String mProducerId;
Producer(String id, Test t) {
mProducerId = id;
mTestRef = t;
}
public void run() {
try {
int i = 0;
while ((++i)<5) {
synchronized (mTestRef) {
String item = mProducerId + " #" + i;
mTestRef.mCache.add(item);
mTestRef.notify();
}
Thread.sleep(1000);
}
}
catch (InterruptedException ex) {
}
}
}
public static void main(String[] args) {
Test test = new Test();
Thread consumer = new Thread(new Consumer(test));
Thread producer1 = new Thread(new Producer("p1", test));
Thread producer2 = new Thread(new Producer("p2", test));
producer1.start();
producer2.start();
consumer.start();
try {
Thread.sleep(15000);
producer1.interrupt();
producer2.interrupt();
consumer.interrupt();
producer1.join();
producer2.join();
consumer.join();
}
catch (Exception e) {
System.out.println("exception: " + e.getMessage());
}
}
}
output is:
Consume the item: p1 #1
Consume the item: p2 #1
Consume the item: p1 #2
Consume the item: p2 #2
Consume the item: p1 #3
Consume the item: p2 #3
Consume the item: p1 #4
Consume the item: p2 #4
Consume the item: p2 #1
Consume the item: p1 #2
Consume the item: p2 #2
Consume the item: p1 #3
Consume the item: p2 #3
Consume the item: p1 #4
Consume the item: p2 #4