• 1
  • 2
2020-10-15, 22:25
  #1
Medlem
Hej. Jag fr inte riktigt klm p det hr.

Jag skapar tv trdar som har tillgng till en monitor med "synchronized"-funktioner. Nu r det ju s att bda trdar kr, men de kr hela sin grej efter varandra. Dvs varje for-loop kr tills den r slut. Jag hade i stllet nskat att de hade alternerat. Testat olika saker som att lgga till en semafor som skulle f den andra att kra och vice versa, men jag lyckas inte lsa det.
Koden r som fljer.

Kod:
public class Main {
		
	public static void thread1(String name, Monitor mon) {
		
		for (int i = 0; i < 20; i++) {
			mon.sub();
		}

	}


	public static void thread2(String name, Monitor mon) {
		
		for (int i = 0; i < 20; i++) {
			mon.add();
		}
	}


	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
		Monitor mon = new Monitor();

		Thread t1 = new Thread(()-> thread1("t1", mon));
		Thread t2 = new Thread(()-> thread2("t2", mon));
		
		t1.start();
		t2.start();
		t1.join();
		t2.join();
		
		System.out.println( "\nfinal balance is now: " + mon.get() );
	}
	
}


Kod:
public class Monitor {

	private int balance = 0;

	public synchronized void add() {
		balance += 1;
		System.out.println(Thread.currentThread().getName() + " adds 1 and balance is now : " + balance);
	}
	
	public synchronized void sub() {
		balance -= 1;
		System.out.println(Thread.currentThread().getName() + " subtracts 1 and balance is now : " + balance);
	}
	
	public synchronized int get() {
		return balance;
	}
}
Citera
2020-10-15, 22:30
  #2
Medlem
Trollfeeders avatar
Java r vl inte direkt rtt val av sprk fr realtidsprogrammering till att brja med. Garbage cleaning gr sprket vrdelst fr sdant.
Citera
2020-10-15, 22:33
  #3
Medlem
Citat:
Ursprungligen postat av Trollfeeder
Java r vl inte direkt rtt val av sprk fr realtidsprogrammering till att brja med. Garbage cleaning gr sprket vrdelst fr sdant.
Jass? Kan du utveckla? Inte hrt om just det tidigare. Dremot kan jag inte gra ngot t det nu eftersom kursen just r realtidsprogrammering i Java.
Citera
2020-10-15, 23:02
  #4
Medlem
Trollfeeders avatar
Citat:
Ursprungligen postat av dagsvag
Jass? Kan du utveckla? Inte hrt om just det tidigare. Dremot kan jag inte gra ngot t det nu eftersom kursen just r realtidsprogrammering i Java.

Det gr ju att gra, det r bara ett mrkligt val av sprk. Eller medvetet fr att det blir utrymme fr att lra sig. Du kommer nmligen behva planera garbage collections s att dom inte hamnar vid fel tillfllen.

I realtidsprogrammering r mlet att en uppgift ska vara slutfrd fre en deadline. Det kan t ex vara att ABS-funktionen ska sl till inom ett visst tidsintervall frn att man trycker p bromspedel i sin bil, eller att varje frame i en videostrm ska hinna processas inom ett visst fnster, annars laggar bilden. Om vi tar det frsta exemplet, s kan det bli vldigt trkigt om garbage collectorn stter igng just precis nr man trampar p bromsen i halt vglag i en knivig situation och hjulen lser sig i en halv sekund medan den str och tuggar. Just i det exemplet s r Java helt vrdelst och ngot du inte vill anvnda alls. Men i fallet med videostrmmen, s kanske du fr indata lite ojmnt, och d skulle du kunna trigga garbage collectorn dom gnger du mrker att du r klar s tidigt i en frame att den hinner kra klart i tid s att du hinner avkoda nsta frame i tid.
Citera
2020-10-15, 23:09
  #5
Medlem
JohannesSnajdares avatar
Jag tror att 20 iterationer r lite fr kort fr att "timeslicen" ska hinna "kicka in", d.v.s. trden hinner bli klar innan det r dags att vxla krandet till den andra trden.

ka p till 200000 iterationer och se vad du fr fr resultat.
Citera
2020-10-15, 23:16
  #6
Medlem
JohannesSnajdares avatar
Alternativt klm in en liten "sleep" i looparna s fr du ditt nskade resultat...

Kod:
        public static void thread1(String name, Monitor mon) {

                for (int i = 0; i < 20; i++) {
                        mon.sub();
                        try {
                        Thread.sleep(100);
                        } catch(InterruptedException e) {}
                }

        }


        public static void thread2(String name, Monitor mon) {

                for (int i = 0; i < 20; i++) {
                        mon.add();
                        try {
                        Thread.sleep(100);
                        } catch(InterruptedException e) {}
                }
        }
Citera
2020-10-15, 23:17
  #7
Medlem
Citat:
Ursprungligen postat av Trollfeeder
Det gr ju att gra, det r bara ett mrkligt val av sprk. Eller medvetet fr att det blir utrymme fr att lra sig. Du kommer nmligen behva planera garbage collections s att dom inte hamnar vid fel tillfllen.

I realtidsprogrammering r mlet att en uppgift ska vara slutfrd fre en deadline. Det kan t ex vara att ABS-funktionen ska sl till inom ett visst tidsintervall frn att man trycker p bromspedel i sin bil, eller att varje frame i en videostrm ska hinna processas inom ett visst fnster, annars laggar bilden. Om vi tar det frsta exemplet, s kan det bli vldigt trkigt om garbage collectorn stter igng just precis nr man trampar p bromsen i halt vglag i en knivig situation och hjulen lser sig i en halv sekund medan den str och tuggar. Just i det exemplet s r Java helt vrdelst och ngot du inte vill anvnda alls. Men i fallet med videostrmmen, s kanske du fr indata lite ojmnt, och d skulle du kunna trigga garbage collectorn dom gnger du mrker att du r klar s tidigt i en frame att den hinner kra klart i tid s att du hinner avkoda nsta frame i tid.

Tack fr frklaringen.

Citat:
Ursprungligen postat av JohannesSnajdare
Jag tror att 20 iterationer r lite fr kort fr att "timeslicen" ska hinna "kicka in", d.v.s. trden hinner bli klar innan det r dags att vxla krandet till den andra trden.

ka p till 200000 iterationer och se vad du fr fr resultat.

Tack, ja det gjorde skillnad. D frstr jag och d funkar det vl som det ska. Fr syns skull hade det bara sett snyggare ut om den bytte oftare, s gott som varannan. Hur hade man kunnat gra det?
__________________
Senast redigerad av dagsvag 2020-10-15 kl. 23:21.
Citera
2020-10-15, 23:19
  #8
Medlem
Citat:
Ursprungligen postat av JohannesSnajdare
Alternativt klm in en liten "sleep" i looparna s fr du ditt nskade resultat...

Kod:
        public static void thread1(String name, Monitor mon) {

                for (int i = 0; i < 20; i++) {
                        mon.sub();
                        try {
                        Thread.sleep(100);
                        } catch(InterruptedException e) {}
                }

        }


        public static void thread2(String name, Monitor mon) {

                for (int i = 0; i < 20; i++) {
                        mon.add();
                        try {
                        Thread.sleep(100);
                        } catch(InterruptedException e) {}
                }
        }
Ah, Tack!, det gjorde det lite mer uppenbart, men om jag inte vill ha en sleep dr. Sg att jag inte vill att programmet ska saktas ner.
Citera
2020-10-15, 23:44
  #9
Medlem
JohannesSnajdares avatar
D kan du anvnda tv semaforer med en "permit count" p 1, den ena fr den ena trden och den andra fr den andra, sen fr trd1 "slppa fram" trd2 nr den r klar med en iteration och vntar drefter p sin semafor tills trd tv r klar och "slpper fram" trd1 osv osv osv.

i kod skulle den kunna se ut shr typ:

Kod:
public class Main {

        static Semaphore thread1go = new Semaphore(1, true);
        static Semaphore thread2go = new Semaphore(1, true);

        public static void thread1(String name, Monitor mon) {

                for (int i = 0; i < 20; i++) {
                        try {
                        thread1go.acquire();
                        mon.sub();
                        thread2go.release();
                        } catch(InterruptedException e) {}
                }

        }

        public static void thread2(String name, Monitor mon) {

                for (int i = 0; i < 20; i++) {
                        try {
                        thread2go.acquire();
                        mon.add();
                        thread1go.release();
                        } catch(InterruptedException e) {}
                }
        }

        public static void main(String[] args) throws InterruptedException {
                // TODO Auto-generated method stub
                Monitor mon = new Monitor();

                // se till att trd tv blockas frn brjan
                thread2go.acquire();

                Thread t1 = new Thread(()-> thread1("t1", mon));
                Thread t2 = new Thread(()-> thread2("t2", mon));

                t1.start();
                t2.start();
                t1.join();
                t2.join();

                System.out.println( "\nfinal balance is now: " + mon.get() );
        }

}

Du kanske skulle kunna klara dig p en semafor och lta varje trd gra acquire/(, mon.add/mon.sub, release(), det funkar frmodligen men du r inte _garanterad_ att de kommer kras vxelvis, det _kan_ bli s att samma trd snor semaforen nsta runda.
Citera
2020-10-16, 00:04
  #10
Medlem
Citat:
Ursprungligen postat av JohannesSnajdare
D kan du anvnda tv semaforer med en "permit count" p 1, den ena fr den ena trden och den andra fr den andra, sen fr trd1 "slppa fram" trd2 nr den r klar med en iteration och vntar drefter p sin semafor tills trd tv r klar och "slpper fram" trd1 osv osv osv.

Du kanske skulle kunna klara dig p en semafor och lta varje trd gra acquire/(, mon.add/mon.sub, release(), det funkar frmodligen men du r inte _garanterad_ att de kommer kras vxelvis, det _kan_ bli s att samma trd snor semaforen nsta runda.
Tack! Jo, jag lade in en sn, men det funkade allts inte, men inser nu att jag var tvungen att ha 2 stycken semaforer fr att det ska fungera. S de lser upp varandra. Det som stter lite stopp fr mig r att om du tar en acquire s har du semaforen, men det fungerar vl s att nr du vl lmnar loopen s r den frbrukad och du behver ta en ny nsta gng?
Tack s mycket!
Nu r det mycket klarare.
Citera
2020-10-16, 09:58
  #11
Medlem
JohannesSnajdares avatar
Se semaforen som en simpel trave med "passerkort".
acquire() plockar ett passerkort frn traven och kr vidare. r traven tom p passerkort s vntar acquire() tills det lggs till (minst) ett passerkort.
release() r funktionen som lgger till ett passerkort p traven.

/JS
Citera
2020-10-16, 10:39
  #12
Medlem
JohannesSnajdares avatar
Btw, s lmnade jag en liten "frbttringspotential" i mitt kodexempel som du nog br fixa innan du ev. skickar in detta till lrare e.dyl. ;-)

Kodraden:
Kod:
                // se till att trd tv blockas frn brjan
                thread2go.acquire();

kan tas bort om man gr en liten frndring som visar att man frstr hur semaforer funkar ;-)

I all vlmening,
JS
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in