Queue
一、生产者
import java.util.Queue;
public class Producer<T> {
private Queue<T> tasks;
private int maxTaskCount = 0;
public Producer(Queue<T> tasks, int maxTaskCount) {
this.tasks = tasks;
this.maxTaskCount = maxTaskCount;
}
public void produce(T task) throws InterruptedException {
synchronized (tasks) {
while (tasks.size() >= maxTaskCount) {
System.out.println("生产者线程进入等待:" + Thread.currentThread().getName());
tasks.wait();
}
tasks.add(task);
tasks.notifyAll();
}
}
}
二、消费者
import java.util.Queue;
public class Consumer<T> {
private Queue<T> tasks;
public Consumer(Queue<T> tasks) {
this.tasks = tasks;
}
public T consume() throws InterruptedException {
synchronized (tasks) {
while (tasks.size() == 0) {
System.out.println("消费者线程进入等待:" + Thread.currentThread().getName());
tasks.wait();
}
T ret = tasks.poll();
tasks.notifyAll();
return ret;
}
}
}
三、执行类,Main方法
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.TimeUnit;
public class ProducerConsumerAppMain {
public static final Object LOCKER = new Object();
public static void main(String[] args) {
Queue<String> urls = new LinkedList<>();
Consumer<String> consumer = new Consumer<>(urls);
Producer<String> producer = new Producer<>(urls, 1024);
for (int i = 0; i < 100; i++) {
Thread consumerThread = new Thread(() -> {
while (true) {
try {
String url = consumer.consume();
processURL(url);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "消费者-" + i);
consumerThread.start();
}
for (int i = 0; i < 3; i++) {
Thread producerThread = new Thread(() -> {
while (true) {
try {
String url = produceURL();
producer.produce(url);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "生产者-" + i);
producerThread.start();
}
}
private static String produceURL() {
StringBuilder ret = new StringBuilder();
ret.append("www.");
for (int i = 0; i < 6; i++) {
int rand = ((int) (Math.random() * 1000)) % 26;
char ch = (char) (rand + 'a');
ret.append(ch);
}
ret.append(".com");
return ret.toString();
}
private static void processURL(String url) throws InterruptedException {
System.out.println("开始处理:" + url);
Thread.sleep(TimeUnit.SECONDS.toMillis(1));
System.out.println("处理完成:" + url);
}
}