package html; import java.util.LinkedList; import java.util.List; public class KF { public static void main(String[] args) { BlockList list = new BlockList(10); new Thread(new Productor(list)).start(); new Thread(new Consumer(list)).start(); } static class Productor implements Runnable { BlockList list; public Productor(BlockList list) { this.list = list; } @Override public void run() { int i = 0; while (true) { System.err.println("put:" + i); list.put(i++); } } } static class Consumer implements Runnable { BlockList list; public Consumer(BlockList list) { this.list = list; } @Override public void run() { while (true) { Object obj = list.get(); System.err.println("get:" + obj); } } } } class BlockList { List<Object> list; int capacity; public BlockList(int capacity) { this.capacity = capacity; list = new LinkedList<>(); } public boolean put(Object obj) { synchronized (list) { while (list.size() >= capacity) { try { list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } list.add(obj); list.notifyAll(); } return false; } public Object get() { Object obj = null; synchronized (list) { while (list.isEmpty()) { try { list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } obj = list.remove(0); list.notifyAll(); } return obj; } }