import java.util.LinkedList; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.Condition; /** * Created by Administrator. */ public class Buffer { private LinkedList<String> buffer; private int maxSize; private ReentrantLock lock; private Condition lines; private Condition space; private boolean pendingLines;
public Buffer(int maxSize){ this.maxSize = maxSize; buffer = new LinkedList<String>(); lock = new ReentrantLock(); lines = lock.newCondition(); space = lock.newCondition();
@Override public void run(){ buffer.setPendingLines(true); while(mock.hasMoreLines()){ String line = mock.getLine(); buffer.insert(line); } buffer.setPendingLines(false); } }
import java.util.Random;
/** * Created by Administrator. */ public class Consumer implements Runnable { private Buffer buffer; public Consumer(Buffer buffer){ this.buffer = buffer; }
@Override public void run(){ while(buffer.hasPendingLines()){ String line = buffer.get(); processLine(line); } }
private void processLine(String line){ try{ Random random = new Random(); Thread.sleep(random.nextInt(100)); }catch(InterruptedException e){ e.printStackTrace(); } } }
public class Main { public static void main(String[] args){ FileMock mock = new FileMock(100, 10); Buffer buffer = new Buffer(20);
Producer producer = new Producer(mock, buffer); Thread threadProducer = new Thread(producer, "Producer");
Consumer consumers[] = new Consumer[3]; Thread threadConsumers[] = new Thread[3]; for(int i=0; i<3; i++){ consumers[i] = new Consumer(buffer); threadConsumers[i] = new Thread(consumers[i], "Consumer " + i); }
[code="java"]public class FileMock { private String content[]; private int index; public FileMock(int size, int length){ content = new String[size]; for(int i=0; i