这个题目是多线程很常见的题目,主要就是知道wait()和notify()方法的作用
import java.util.Date;
import java.util.LinkedList;
/**
* 用wait/notify实现生产者消费者
* @author : vi3nty
* @date : 21:08 2020/4/17
*/
public class ProducerConsumer {
public static void main(String[] args) {
TaskEvent taskEvent=new TaskEvent();
TaskProducer producer=new TaskProducer(taskEvent);
TaskConsumer consumer=new TaskConsumer(taskEvent);
producer.start();
consumer.start();
}
}
//定义生产者线程
class TaskProducer extends Thread{
private TaskEvent taskEvent;
public TaskProducer(TaskEvent taskEvent){
this.taskEvent=taskEvent;
}
@Override
public void run() {
//这里写循环到100只是让程序停止下来
for(int i=0;i<100;i++){
try {
taskEvent.producer();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//定义消费者线程
class TaskConsumer extends Thread{
private TaskEvent taskEvent;
public TaskConsumer(TaskEvent taskEvent){
this.taskEvent=taskEvent;
}
@Override
public void run() {
for(int i=0;i<100;i++){
try {
taskEvent.consumer();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//定义任务
class TaskEvent{
private static final int MAXSIZE=10;
private LinkedList<Date> list;
public TaskEvent() {
this.list = new LinkedList<>();
}
synchronized void producer() throws InterruptedException {
while (list.size()==MAXSIZE){
wait();
}
list.add(new Date());
System.out.println("当前生产了"+list.size()+"个");
notify();
}
synchronized void consumer() throws InterruptedException {
while (list.size()==0){
wait();
}
list.poll();
System.out.println("当前消费了1个,还剩"+list.size()+"个");
notify();
}
}
代码执行结果,比较好的按照预想的情况执行了。这里所涉及的知识点就是wait()方法是释放monitor锁的,这时候其他线程就可以重新拿到锁。
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前生产了10个
当前消费了1个,还剩9个
当前生产了10个
当前消费了1个,还剩9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
Process finished with exit code 0