Java-Multithreading: Wie kann die gleichzeitige Reproduktionslogik zwischen zwei Threads verhindert werden?Java

Java-Forum
Guest
 Java-Multithreading: Wie kann die gleichzeitige Reproduktionslogik zwischen zwei Threads verhindert werden?

Post by Guest »

Ich habe eine Fish-Klasse erstellt, die einen Fisch simuliert, der sich in einem Java-Programm reproduziert. Jeder Fisch muss sich fortpflanzen, indem er einen anderen zufälligen Fisch trifft. Das Problem ist aber, dass sich zwei Fische als Paar finden und gleichzeitig zwei Kinder zeugen. Dieser Fortpflanzungsprozess wiederholt sich mehrmals gleichzeitig.
Ich halte Fische im Aquarienunterricht. Nachdem der Fisch geboren wurde, nachdem er das Brutalter erreicht hat (dh er sollte mit 4 Jahren beginnen), sollte er einen zufälligen Partner aus der Aquarium-Klasse finden. Aber in dem Code, den ich geschrieben habe, möchte ein Fisch einen Partner finden und sich fortpflanzen, und in diesem Moment vermehrt sich dieser Fisch auch, indem er den ersten Fisch aus der Aquarium-Klasse auswählt. Zwei Fische werden an einem Ort im Meer geboren. Eigentlich sollte ein Fisch geboren werden. Ich kann nicht herausfinden, wie ich dieses Problem lösen kann. Das eigentliche Problem liegt in der Reproduktionsmethode. Wo und wie man es schreibt. Bitte schlagen Sie mir optimale Lösungen vor. Vielen Dank im Voraus für die Antworten an alle.
Ich habe eine Fischklasse:
package lesson.uz;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

import java.util.Random;

@Getter
@Setter
@EqualsAndHashCode
public class Fish extends Thread {

private long id;
private Gender gender;
private Integer lifespan;
private String fishName;
private Integer age = 0;
private static Long counter = 1L;

public Fish(Gender gender) {
this.gender = gender;
this.lifespan = new Random().nextInt(11)+40;
this.fishName = "Fish"+ counter++;
this.id = Math.abs(new Random().nextLong() * System.currentTimeMillis());
System.out.println(fishName + " created. "+System.currentTimeMillis());
}

@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
reproduce();
age++;
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}

}

public void reproduce() {
Fish randomFish = getRandomFish();
long count = Aquarium.raddom.stream().filter(id -> randomFish.getId() == id || this.getId() == id).count();

if (count == 0 && this.age >= 4 && randomFish.getAge() >= 4 && this.getGender() != randomFish.getGender()) {

Aquarium.raddom.add(this.id);
Aquarium.raddom.add(randomFish.id);

System.out.println(this.fishName + " and " + randomFish.getFishName() + " meet.\n");
Fish babyFish = createFish();
Aquarium.fishList.add(babyFish);
Aquarium.raddom.remove(this.id);
Aquarium.raddom.remove(randomFish.id);
}
}

public static Fish createFish() {
Fish newFish = new Fish(Math.random() > 0.5 ? Gender.MALE : Gender.FEMALE);
newFish.start();
return newFish;
}

public Fish getRandomFish() {
int randomNum = 0;
Fish currenFish = null;
while (true) {
randomNum = new Random().nextInt(Aquarium.fishList.size());
currenFish = Aquarium.fishList.get(randomNum);

if (this != currenFish) {
break;
}
}
return currenFish;
}
}

Ich habe einen Aquarium-Kurs:
package lesson.uz;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Aquarium extends Thread {

public static List fishList = new ArrayList();
public static List raddom = new ArrayList();

@Override
public void run() {

}
}

und Hauptklasse:
package lesson.uz;

public class Main {

public static void main(String[] args) {
Aquarium aquarium = new Aquarium();
aquarium.start();
init();
}

public static void init() {
Fish fish1 = new Fish(Gender.MALE);
fish1.start();
Aquarium.fishList.add(fish1);
Fish fish2 = new Fish(Gender.FEMALE);
fish2.start();
Aquarium.fishList.add(fish2);
}
}

Problem (Problem):
Fisch A und Fisch B wählen sich gegenseitig als Partner aus.
Gleichzeitig wählt Fisch B auch Fisch A aus und beginnt mit dem Prozess der Fortpflanzung parallel.
Dadurch entstehen zwei Kinder gleichzeitig.
Frage:
Wie kann dieses Problem gelöst werden? Wie können Sie sicherstellen, dass der Reproduktionsprozess jeweils nur einmal erfolgt?
public static List raddom = new ArrayList();

Ich habe versucht, das Problem zu lösen, indem ich eine Raddomliste (im Sinne einer Entbindungsstation) hinzugefügt habe. Mein Programm ist noch nicht fertig. Aber es hat nicht geholfen. Bitte schlagen Sie mir optimale Lösungen vor.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post