Я пытаюсь сделать небольшую программу, используя темы, которые имеют 3 пьющих и каждый из них будет пить только если у него есть 3 вещи, указанные в программеНеправильный выход при использовании темы
каждый из них должен начинаться при наличии один из 3-х вещей
Это то, что я так и сделал тариф
import java.util.*;
import test.Producer.Consumer;
public class PC {
public static void main(String[] args) {
AllResource c = new AllResource("water");
AllResource c2 = new AllResource("ice");
AllResource c3 = new AllResource("glass");
Producer p1 = new Producer(c, 1); // One Producer which acting as Server
Consumer c1 = new Consumer(c, 1); // Consumer = Drinker(s)
Consumer con2 = new Consumer(c2, 2);
Consumer con3 = new Consumer(c3, 3);
p1.start();
p1 = new Producer(c2, 2);
p1.start();
p1=new Producer(c3, 3);
c1.start();
con2.start();
con3.start();
}
}
class AllResource {
private String resource;
private boolean avail = false;
ArrayList availableReource=new ArrayList();
AllResource(String value){
resource=value;
}
public boolean getAvail() {
return avail;
}
public void setAvail(boolean avail1) {
avail=avail1;
}
public synchronized String get(String value,boolean a, int number) {
vail=a;
if (avail == false) {
resource=value;
try {
wait();
}
catch (InterruptedException e) {
}
}
else {
resource=value;
avail = false;
notifyAll();
}
return resource;
}
public String getResource() {
return resource;
}
public synchronized void put(String value, boolean a) {
avail=a;
if (avail == true) {
resource=value;
try {
wait();
}
catch (InterruptedException e) {
}
}
else {
resource = value;
avail = true;
notifyAll();
}
}
}
class Producer extends Thread {
private AllResource allResource;
private int number;
String resource[]={"water", "ice", "glass"};
ArrayList al=new ArrayList();
public Producer(AllResource c, int number) {
allResource = c;
this.number = number;
al.add(c.getResource());
}
public void run() {
while(true) {
int rand=0;
for(int j=0;j<resource.length;j++) {
rand=(int)(Math.random() * 3);
if(allResource.getResource()==(resource[rand])) {
allResource.put("",true);
}
else {
allResource.put(resource[rand],false);
}
System.out.println("Server #" + " put: "
+ resource[rand] + " for Drinker "+this.number);
}
}
}
class Consumer extends Thread {
private AllResource allResource;
private int number;
String resource[]={"water", "ice", "glass"};
public Consumer(AllResource c, int number) {
allResource = c;
this.number = number;
}
public void run() {
while(true) {
for(int j=0;j<resource.length;j++) {
if(allResource.getResource().equals(resource[j])) {
allResource.get("",false,this.number);
}
else {
allResource.get((String)resource[j],true,this.number);
}
System.out.println("Drinker #" + this.number + " received: " + resource[j]);
}
}
}
}
}
Я получаю неправильный выход по какой-то причине Вот часть вывода
Server # put: glass for Drinker 1
Drinker #3 received: water // drinker #3 received water even though there is no water provided for anyone
Drinker #3 received: ice // drinker 3 received ice even though there is no ice provided for anyone
Server # put: ice for Drinker 2
Drinker #2 received: water // drinker 2 should receive ice not water
Server # put: glass for Drinker 2
Drinker #3 received: glass // drinker 2 should receive glass not drinker 3 !
Server # put: glass for Drinker 1
Drinker #1 received: water // it should receive glass not water
Server # put: ice for Drinker 1
// and now it's receiving lots of things and the server is not providing anything for him !
Drinker #3 received: water
Drinker #3 received: ice
Drinker #3 received: glass
Drinker #3 received: water
// same thing
Server # put: water for Drinker 2
Drinker #2 received: ice
Drinker #3 received: ice
Drinker #1 received: ice
Может кто-нибудь мне помочь? Я не знаю, почему я получаю эти виды логических ошибок
Вы разместили довольно длинный блок кода, и он даже не отступил. Анализ чужого многокритериального кода, когда код даже не отступом, непростая задача. –
Имейте в виду, что при использовании System.out вывод из разных потоков может не отображаться в «правильном» порядке. –
синхронизировать часть, где вы печатаете оставшиеся ресурсы, и посмотреть, что произойдет, чем – Antoniossss