Créez 2 fils, jouez les uns avec les autres et affichez le résultat. Il est téléchargé sur GitHub → threadJankenGame
JankenCallable.java
package game;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
import game.Janken.Hand;
public class JankenCallable implements Callable<Janken.Hand> {
public static int playerNumber = 1;
public final static Object lock = new Object();
@Override
public Hand call() throws Exception {
TimeUnit.SECONDS.sleep(1);
synchronized (lock) {
playerNumber++;
if (playerNumber % 2 == 0) {
System.out.println("Nom de la première personne:" + Thread.currentThread().getName());
} else {
System.out.println("Nom de famille:" + Thread.currentThread().getName());
}
}
return Janken.getHand();
}
}
Janken.java
package game;
public class Janken {
public enum Hand {
GUU("Goo"), CHOKI("Choki"), PAA("Par");
private final String hand;
private Hand(String hand) {
this.hand = hand;
}
public String getHand() {
return hand;
}
}
/**
*Afficher le résultat de Janken
*
* @param firstPlayerHand
*La première main
* @param secondPlayerHand
*La seconde main
*/
public static void getGameResult(Hand firstPlayerHand, Hand secondPlayerHand) {
//Placez temporairement le gagnant de Janken comme première personne
Hand winner = firstPlayerHand;
if (firstPlayerHand == Hand.GUU && secondPlayerHand == Hand.PAA) {
winner = secondPlayerHand;
} else if (firstPlayerHand == Hand.CHOKI && secondPlayerHand == Hand.GUU) {
winner = secondPlayerHand;
} else if (firstPlayerHand == Hand.PAA && secondPlayerHand == Hand.CHOKI) {
winner = secondPlayerHand;
}
System.out.println(getPlayerHand(firstPlayerHand, secondPlayerHand));
if (firstPlayerHand == secondPlayerHand) {
System.out.println("C'est Aiko.");
} else if (winner == firstPlayerHand) {
System.out.println("La première personne gagne.");
} else if (winner == secondPlayerHand) {
System.out.println("La deuxième personne gagne.");
}
System.out.println("");
}
/**
*Prenez la main de Janken au hasard
* @retourner la main de Janken
*/
public static Hand getHand() {
double random = Math.random() * 10;
if (6.6 < random) {
return Hand.GUU;
} else if (3.3 < random) {
return Hand.CHOKI;
}
return Hand.PAA;
}
/**
*Montrez la main que le joueur a lancée
*
* @param firstPlayerHand
*La première main
* @param secondPlayerHand
*La seconde main
* @retour Comment sortir la première et la seconde main
*/
private static String getPlayerHand(Hand firstPlayerHand, Hand secondPlayerHand) {
return "La première main" + String.format("%s", firstPlayerHand.getHand()) + ": La seconde main"
+ String.format("%s", secondPlayerHand.getHand());
}
}
Main.java
package game;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import game.Janken.Hand;
public class Main {
//Nombre de pools de threads pour un jeu Janken exclusivement pour 2 joueurs"2"Sera limité
private static final int THREAD_POOL_COUNT = 2;
//Nombre de parties de Janken
private static final int GAME_COUNT = 3;
public static void main(String[] args) {
ExecutorService executorService = Executors.newScheduledThreadPool(THREAD_POOL_COUNT);
List<Future<Hand>> jankenList = new ArrayList<>();
for (int i = 0; i < GAME_COUNT * 2; i++) {
Future<Hand> future = executorService.submit(new JankenCallable());
jankenList.add(future);
}
int count = 0;
Hand firstPlayerHand = null;
Hand currentPlayerHand = null;
for (Future<Hand> hand : jankenList) {
count++;
try {
currentPlayerHand = hand.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} finally {
executorService.shutdown();
}
//Afficher le résultat lorsque la première et la deuxième mains sont décidées
if (count % THREAD_POOL_COUNT == 0) {
Janken.getGameResult(firstPlayerHand, currentPlayerHand);
} else {
firstPlayerHand = currentPlayerHand;
}
}
}
}
Prénom: piscine-1-thread-1
Deuxième nom: piscine-1-thread-2
La première main est goo: la seconde main est goo
C'est Aiko.
Prénom: piscine-1-thread-1
Deuxième nom: piscine-1-thread-2
La première main est goo: la seconde main est par
La deuxième personne gagne.
Prénom: piscine-1-thread-2
Deuxième nom: piscine-1-thread-1
La première main est normale: la seconde main est gluante
La première personne gagne.
Traitement multi-thread en Java à l'aide d'ExecutorService Si le StaticObject utilisé pour le bloc synchronisé change, il n'est pas effectivement synchronisé
・ Vous ne pouvez pas jouer au jeu Janken avec plus de 3 personnes (3 fils). -Je voulais aligner la position des deux points résultants (:).
Le traitement du fil est difficile.
Recommended Posts