[thread] rzut kostką

0

witam:)
ostatnio zacząłem interesować sie javą. na jednej ze stron znalazlem takie oto zadanie :

Napisac klase RzutKostka, dziedziczaca po Thread. Obiekt takiej klasy posiada pola:
² numer typu int,
² pis klasy PipedInputStream,
² pos klasy PipedOutputStream.
Pola klasy zostaja zainicjowane w konstruktorze, który posiada odpowiadajace im trzy
parametry.
Klasa ta słuzy do przeprowadzenia gry kostka. W celu przeprowadzenia gry nalezy uruchomic
jednoczesnie dwa watki klasy RzutKostka. Strumienie pin i pos jednego watku
musza byc odpowiednio połaczone ze strumieniami watku drugiego, numer zas jest uzywany
tylko do identyfikacji watku. Obydwa watki losuja liczbe (1..6), a nastepnie uzgadniaja,
kto wygrał i wyswietlaja wynik gry w nastepujacej postaci:
Watek nr 2: wygralem 4:2
Watek nr 1: przegralem 2:4
W przypadku, gdy obydwa watki wyrzuca ta sama wartosc, rzut kostka powinien byc
powtórzony.
W razie wystapienia jakiegokolwiek wyjatku, watek wyswietla komunikat i konczy działanie.
Napisac program testujacy działanie dwóch watków klasy RzutKostka.

w jaki sposob go trzeba napisac?
czytalem troche na temat wątków, ale jako że nigdy tego nie robiłem to nawet nie wiem jak zacząć pisać taki program..
mógłby mi ktoś pomóc? tzn. albo napisać cały kod, albo chociaż dać jakieś wskazówki jak to napisać... szczerze mówiąc to wolałbym cały kod, gdyz za kilka dni zostane odcięty od netu, a jak bede miec kod to zawsze go jakos skumam :)

z góry dzieki:)

0
package test;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author pustak
 * @version 0.1
 *
 */
public class Kostka {

	/**
	 * Wykonuje rzut dwoma kostkami
	 * @throws IOException
	 */
	public void rzuc() throws IOException {
		PipedInputStream k1Pis = new PipedInputStream();
		PipedInputStream k2Pis = new PipedInputStream();
		PipedOutputStream k1Pos = new PipedOutputStream(k2Pis);
		PipedOutputStream k2Pos = new PipedOutputStream(k1Pis);

		ExecutorService exec = Executors.newFixedThreadPool(2);
		exec.execute(new RzutKostka(1, k1Pis, k1Pos));
		exec.execute(new RzutKostka(2, k2Pis, k2Pos));

		exec.shutdown();
	}

	/**
	 * Main
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			Kostka kostka = new Kostka();
			kostka.rzuc();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

}

/**
 * Wątek rzutu kostką
 * @author pustak
 * @version 0.1
 *
 */
class RzutKostka extends Thread {
	private final int numer;
	private PipedInputStream pis;
	private PipedOutputStream pos;

	/**
	 * Inicjuje wątek
	 * @param numer identyfikator kostki
	 * @param pis strumień wyjścia
	 * @param pos strumiń wyjścia
	 */
	public RzutKostka(int numer, PipedInputStream pis, PipedOutputStream pos) {
		this.numer = numer;
		this.pis = pis;
		this.pos = pos;
	}

	@Override
	public void run() {
		int kostka = (int)(Math.random() * 5) + 1;

		try {
			byte[] inputBytes = new byte[1];

			String msg = String.valueOf(kostka);
			pos.write(msg.getBytes(), 0, 1);
			pos.flush();


			pis.read(inputBytes);

			String inputString = new String(inputBytes);
			int kostka2 = Integer.parseInt(inputString);

			if(kostka2 < kostka)
				System.out.println("id["+numer+"]: "+kostka+","+kostka2+" wygrałem!");
			else if(kostka2 > kostka)
				System.out.println("id["+numer+"]: "+kostka+","+kostka2+" przegrałem!");
			else
				System.out.println("id["+numer+"]: "+kostka2+","+kostka+" remis!");


		}catch(IOException e) {
			System.out.println("Błąd We/Wy:\n"+e.getMessage());
		}
	}

	@Override
	public String toString() {
		return ""+numer;
	}
}
0
pustak napisał(a)
1.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

2.
ExecutorService exec = Executors.newFixedThreadPool(2);
exec.execute(new RzutKostka(1, k1Pis, k1Pos));
exec.execute(new RzutKostka(2, k2Pis, k2Pos));

3.
exec.shutdown();

4.
e.printStackTrace();
byte[] inputBytes = new byte[1];

5.
String msg = String.valueOf(kostka);
pos.write(msg.getBytes(), 0, 1);
pos.flush();
pis.read(inputBytes);

6.
@Override
public String toString() {
return ""+numer;
}

powyżej zamieściłem linijki kodu których nie rozumiem.... mógłby mi ktoś wytłumaczyć co robi każda z nich?

0
Executors.newFixedThreadPool(2); //tworzy pule wątków o określonym rozmiarze (2)

//odpala zadania (w poleceniu miałeś dziedziczenie po Thread, generalnie dałbym to jako Runnable)
exec.execute(new RzutKostka(1, k1Pis, k1Pos));
exec.execute(new RzutKostka(2, k2Pis, k2Pos));

exec.shutdown(); //nie przyjmuje więcej zadań

e.printStackTrace(); //drkukuje stos wywołań dla wyjątku

byte[] inputBytes = new byte[1]; //tablica bajtów o rozmiarze 1 (do pobrania wiadomości z Pipe'a) 
//rozmiar 1 bo wysyłąmy cyfry 1-6


String msg = String.valueOf(kostka); //konwersja int na string
pos.write(msg.getBytes(), 0, 1); //wysyłanie bajtów stringa wiadomości (rzutu kostką)
pos.flush(); //przesłanie
pis.read(inputBytes); //odczyt wiadomości z pip'a (wysłanej przez 2 wątek)

//Generanie na koniec metody Run powinno się pozamykać Strumienie
pos.close();
pis.close();

//Generanie powinno być getName() zamiast toString, tak aby nazwa wątku była by jego identyfikatorem
@Override
public String getName() {
	return ""+numer;
}


//Generanie zamiast Math.random możesz użyć java.util.Random
Random rnd = new Random();
int kostka = rnd.nextInt(6) + 1;
0

dzieki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1