package mythreed;
/**
* 生产者
*/
public class Producter implements Runnable {
@Override
public void run() {
synchronized (MainApp.lock) {
while (true) {
double timer = Math.random();
try {
Thread.sleep((long) (timer * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
MainApp.queue.add(timer + "");
System.out.println("生产了一条数据" + timer);
if (MainApp.queue.size() > 5) {
MainApp.lock.notifyAll();
try {
System.out.println("生产者等待");
MainApp.lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
package mythreed;
/**
* 消费者
*/
public class Consumer implements Runnable {
@Override
public void run() {
synchronized (MainApp.lock) {
while (true) {
for (String msg : MainApp.queue) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费了一条数据"+MainApp.queue.poll());
}
System.out.println("消费者等待");
MainApp.lock.notifyAll();
try {
MainApp.lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
package mythreed;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
/**
* 测试生产者消费者
*/
public class MainApp {
public static volatile Queue<String> queue = new ArrayBlockingQueue<>(6);
public static Object lock = new Object();
public static void main(String[] args) {
Producter producter = new Producter();
Thread thread1 = new Thread(producter);
thread1.start();
Consumer consumer = new Consumer();
Thread thread2 = new Thread(consumer);
thread2.start();
}
}