Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //reshenie na:
- //https://github.com/finki-mk/OS/tree/master/synchronization/src/main/java/mk/ukim/finki/os/synchronization/exam19/k1/g1
- import java.lang.reflect.GenericArrayType;
- import java.util.HashSet;
- import java.util.concurrent.Semaphore;
- import java.util.concurrent.locks.Lock;
- class Locks{
- static Semaphore greenPlayers;
- static Semaphore redPlayers;
- static int numPlayers = 0;
- static Semaphore canPlay;
- static Semaphore gameFinished;
- }
- class GreenPlayer extends Thread {
- public void execute() throws InterruptedException {
- System.out.println("Green player ready");
- Thread.sleep(50);
- Locks.greenPlayers.acquire(); //maksimum dvajca ke dojdat
- System.out.println("Green player here");
- boolean controller = false;
- Locks.numPlayers++;
- if(Locks.numPlayers==4){ //posledniot igrac ke bide kontrolerot
- Locks.canPlay.release(4);
- controller = true;
- }
- for(int i=1;i<=3;i++) {
- Locks.canPlay.acquire();
- System.out.println("Game " + i + " started");
- Thread.sleep(200);
- System.out.println("Green player finished game " + i);
- Locks.gameFinished.release();
- if (controller) {
- Locks.gameFinished.acquire(4);
- System.out.println("Game " + i + " finished");
- if(i!=3) {
- Locks.canPlay.release(4);
- }
- }
- }
- if(controller){
- System.out.println("Match finished");
- Locks.numPlayers = 0;
- Locks.redPlayers.release(2);
- Locks.greenPlayers.release(2);
- }
- }
- @Override
- public void run() {
- try {
- execute();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- class RedPlayer extends Thread{
- public void execute() throws InterruptedException {
- System.out.println("Red player ready");
- Thread.sleep(50);
- Locks.redPlayers.acquire(); //maksimum 2ca ke dojdat
- System.out.println("Red player here");
- boolean controller = false;
- Locks.numPlayers++;
- if(Locks.numPlayers==4){
- Locks.canPlay.release(4);
- controller = true;
- }
- for(int i=1;i<=3;i++) {
- Locks.canPlay.acquire();
- System.out.println("Game " + i + " started");
- Thread.sleep(200);
- System.out.println("Red player finished game " + i);
- Locks.gameFinished.release();
- if (controller) {
- Locks.gameFinished.acquire(4);
- System.out.println("Game " + i + " finished");
- if(i!=3) {
- Locks.canPlay.release(4);
- }
- }
- }
- if(controller){
- System.out.println("Match finished");
- Locks.numPlayers = 0;
- Locks.redPlayers.release(2);
- Locks.greenPlayers.release(2);
- }
- }
- @Override
- public void run() {
- try {
- execute();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- public class MacauCardTournament {
- public static void init(){
- Locks.greenPlayers = new Semaphore(2);
- Locks.redPlayers = new Semaphore(2);
- Locks.canPlay = new Semaphore(0);
- Locks.gameFinished = new Semaphore(0);
- }
- public static void main(String[] args) throws InterruptedException {
- HashSet<Thread> threads = new HashSet<Thread>();
- for (int i = 0; i < 30; i++) {
- RedPlayer red = new RedPlayer();
- threads.add(red);
- GreenPlayer green = new GreenPlayer();
- threads.add(green);
- }
- init();
- // start 30 red and 30 green players in background
- for(Thread t:threads){
- t.start();
- }
- for(Thread t:threads){
- t.join();
- }
- // after the waiting for each of the players is done, check the one that are not finished and terminate them
- System.err.println("Uspeh");
- }
- }
Add Comment
Please, Sign In to add comment