I hope this solution gives you some help:
説明は次のとおりです。
2 つの別々のスレッド(Producer thread and Consumer thread)
が、共通のキュー (ここでは配列について言及しました) で互いに連携して動作します。プロデューサーはデータ配列から 3 つの要素を配置し、コンシューマーは 1 つをフェッチして同じ配列から削除します。データ配列のすべての要素がキューに配置されると、コンシューマーは 1 つずつフェッチするだけです。put()
およびtake()
は、別のクラスで定義された同期メソッドDrop
です。
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ProducerConsumerExample {
public static final Lock fileLock = new ReentrantLock();
public static final Condition condition = fileLock.newCondition();
public static String importantInfo[] = {
"Mares eat oats",
"Does eat oats",
"Little lambs eat ivy",
"A kid will eat ivy too",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqr"
};
public static List<String> list = new ArrayList<String>();
public static boolean done = false;
public static void main(String[] args) {
Drop drop = new Drop();
Thread tProducer = new Thread(new Producer(drop));
Thread tConsumer = new Thread(new Consumer(drop));
try{
tProducer.start();
tConsumer.start();
}
catch(Exception ie){}
}
}
public class Consumer implements Runnable {
private Drop drop;
public Consumer(Drop drop) {
this.drop = drop;
}
public void run() {
try{
ProducerConsumerExample.fileLock.lock();
for (String message = drop.take();
! message.equals("DONE");
message = drop.take()) {
System.out.format("MESSAGE RECEIVED: %s%n", message);
ProducerConsumerExample.list.remove(0);
if(ProducerConsumerExample.done)
continue;
else{
ProducerConsumerExample.condition.signal();
System.out.println("Consumer is waiting");
ProducerConsumerExample.condition.await();
}
} catch (InterruptedException e) {}
}
}
catch(Exception e){
}
finally{
ProducerConsumerExample.fileLock.unlock();
}
}
}
import java.util.Random;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Producer implements Runnable {
private Drop drop;
public Producer(Drop drop) {
this.drop = drop;
}
public void run() {
try{
ProducerConsumerExample.fileLock.lock();
Random random = new Random();int check = 3;
for (int i = 0;
i <ProducerConsumerExample.importantInfo.length;
i++) {
if(i<check){
System.out.println("Putting message");
System.out.println(ProducerConsumerExample.importantInfo[i]);
drop.put(ProducerConsumerExample.importantInfo[i]);
}
else{
check = check+3;
i--;
ProducerConsumerExample.condition.signal();
System.out.println("Producer is waiting");
ProducerConsumerExample.condition.await();
}
}
drop.put("DONE");
ProducerConsumerExample.done =true;
ProducerConsumerExample.condition.signal();
System.out.println("Producer is waiting");
ProducerConsumerExample.condition.await();
}
catch(Exception e){
e.printStackTrace();
}
finally{
ProducerConsumerExample.fileLock.unlock();
}
}
}
import java.util.ArrayList;
import java.util.List;
public class Drop {
// Message sent from producer
// to consumer.
private String message;
public synchronized String take() {
System.out.println(ProducerConsumerExample.list.size());
return ProducerConsumerExample.list.get(0);
}
public synchronized void put(String message) {
// Store message.
ProducerConsumerExample.list.add(message);
}
}