🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: be.comp.programming
6 messages
6 total messages Started by Passero Sun, 25 Jan 2004 15:40
[java]multithreading vraagje/probleem
#3215
Author: Passero
Date: Sun, 25 Jan 2004 15:40
85 lines
3155 bytes
Morgen heb ik examen java en ben enkele oefeningen aan het maken. 1 van die
oefeningen lukt niet echt. All� ze werkt, ik krijg geen fouten maar ben niet
zeker of het fout is. Het gaat om volgende oefening:
We moeten een restaurant simuleren met 1 kok en 2 kelners. Een kelner moet
om een bestelling komen bij de kok en dan moet de kelner tussen 0 en 2 sec
slapen. Ik heb dat gedaan en telkens als ik het programma uitvoer krijg ik
altijd als uitvoer eerst kelner1 dan kelner2 dan weer 1 dan weer 2 en zo tot
op het einde. Aangezien ik met multithreading zit en een random getal
genereer tussen 0 en 2 sec moet het toch voorkomen dat 1 kelner 2 opdrachten
na elkaar doet? Waar zit dan mijn fout in mijn code?

Dit is de code:

public class kok extends Thread
{
 private Kelner piet = new Kelner("Piet",this);
 private Kelner jan = new Kelner("Jan",this);
 private boolean isVrij = true;

 public void run()
 {
  piet.start();
  jan.start();
  while(true)
  {
   try
   {
    sleep((long)Math.random()*2000);
    if(jan.getIsVrij())
    {
     jan.krijgOpdracht(new Order());
    }
    sleep((long)Math.random()*2000);
    {
    if(piet.getIsVrij())
     piet.krijgOpdracht(new Order());
    }
   }
   catch(InterruptedException ie){}
  }

 }

 public synchronized boolean getIsVrij()
 {
  return isVrij;
 }
}


public class Kelner extends Thread
{
 private String naam;
 private kok deKok;
 private boolean isVrij = true;

 public Kelner(String eenNaam,kok eenKok)
 {
  naam = eenNaam;
  deKok = eenKok;
 }



 public synchronized boolean getIsVrij()
 {
  return isVrij;
 }

 public synchronized void setIsVrij(boolean vrij)
 {
  isVrij = vrij;
 }

 public void krijgOpdracht(Order eenOrder)
 {
  try{
   System.out.println(naam  + " ontvangt: " + eenOrder.toString());
   setIsVrij(false);
   sleep((long)Math.random()*2000);
   setIsVrij(true);
  }
  catch(InterruptedException ie){}
 }
}
Re: [java]multithreading vraagje/probleem
#3216
Author: Stijn De Smet
Date: Sun, 25 Jan 2004 16:58
21 lines
2250 bytes
Passero wrote:

> Morgen heb ik examen java en ben enkele oefeningen aan het maken. 1 van
> die oefeningen lukt niet echt. All� ze werkt, ik krijg geen fouten maar
> ben niet zeker of het fout is. Het gaat om volgende oefening:
> We moeten een restaurant simuleren met 1 kok en 2 kelners. Een kelner moet
> om een bestelling komen bij de kok en dan moet de kelner tussen 0 en 2 sec
> slapen. Ik heb dat gedaan en telkens als ik het programma uitvoer krijg ik
> altijd als uitvoer eerst kelner1 dan kelner2 dan weer 1 dan weer 2 en zo
> tot op het einde. Aangezien ik met multithreading zit en een random getal
> genereer tussen 0 en 2 sec moet het toch voorkomen dat 1 kelner 2
> opdrachten na elkaar doet? Waar zit dan mijn fout in mijn code?
> 

(long)Math.random()*2000 vervangen door 
(long)(Math.random()*2000)
De cast heeft hogere prioriteit dan de vermeningvuldiging, en aangezien
Math.random een getal tussen 0 en 1 teruggeeft gaat dit altijd 0 zijn.
-- 
Groeten,
Stijn 
Re: [java]multithreading vraagje/probleem
#3217
Author: Nicolas Barbier
Date: Sun, 25 Jan 2004 17:18
23 lines
2364 bytes
Passero wrote:

> Morgen heb ik examen java en ben enkele oefeningen aan het maken. 1 van
> die oefeningen lukt niet echt. All� ze werkt, ik krijg geen fouten maar
> ben niet zeker of het fout is. Het gaat om volgende oefening:
> We moeten een restaurant simuleren met 1 kok en 2 kelners. Een kelner moet
> om een bestelling komen bij de kok en dan moet de kelner tussen 0 en 2 sec
> slapen. Ik heb dat gedaan en telkens als ik het programma uitvoer krijg ik
> altijd als uitvoer eerst kelner1 dan kelner2 dan weer 1 dan weer 2 en zo
> tot op het einde. Aangezien ik met multithreading zit en een random getal
> genereer tussen 0 en 2 sec moet het toch voorkomen dat 1 kelner 2
> opdrachten na elkaar doet? Waar zit dan mijn fout in mijn code?

(snip code)

Je start twee kelnerthreads die meteen weer stoppen omdat je de run-method
niet hebt veranderd, maw alles gebeurt in de eerste thread. Het is dan
moeilijk om nog te spreken van multithreading. Misschien toch het hoofdstuk
over multithreading nog eens herlezen (-;.

-- 
Nicolas Barbier
Protecting innovation against patent inflation <url:http://swpat.ffii.org/>
Re: [java]multithreading vraagje/probleem
#3218
Author: F. Henninger
Date: Sun, 25 Jan 2004 17:36
136 lines
4907 bytes
This is a multi-part message in MIME format.
--------------080406010105090207050907
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: quoted-printable

Passero wrote:
> Morgen heb ik examen java en ben enkele oefeningen aan het maken. 1 van=
 die
> oefeningen lukt niet echt. All=E9 ze werkt, ik krijg geen fouten maar b=
en niet
> zeker of het fout is. Het gaat om volgende oefening:
> We moeten een restaurant simuleren met 1 kok en 2 kelners. Een kelner m=
oet
> om een bestelling komen bij de kok en dan moet de kelner tussen 0 en 2 =
sec
> slapen. Ik heb dat gedaan en telkens als ik het programma uitvoer krijg=
 ik
> altijd als uitvoer eerst kelner1 dan kelner2 dan weer 1 dan weer 2 en z=
o tot
> op het einde. Aangezien ik met multithreading zit en een random getal
> genereer tussen 0 en 2 sec moet het toch voorkomen dat 1 kelner 2 opdra=
chten
> na elkaar doet? Waar zit dan mijn fout in mijn code?
>=20
 > [knip code]

Simpel, wat je nu doet is het volgende:
  1. Wacht een tijdje
  2. Roep methode van Kelner A aan
  3. Wacht een tijdje
  4. Roep methode van Kelner B aan
  5. Ga naar 1.

Voor het bovenstaande heb je niet echt multitrheading nodig, wat je=20
wilt doen is het volgende:
  - Start Kelner A en B
  1. Kelner A wacht een tijdje || Kelner B wacht een tijdje
  2. Kelner A levert order in  || Kelner B levert een order in
  3. Ga naar 1.

Hierbij stelt '||' het concept 'gelijktijdig met' voor.

Ik heb je meegeleverde code wat aangepast zodat het wel parallel werkt.

--=20
Francis Henninger
Studying something called Computer Science
University of Twente
The Netherlands

--------------080406010105090207050907
Content-Type: text/plain;
 name="Kok.java"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="Kok.java"

public class Kok
{
  private Kelner piet;
  private Kelner jan;

  private Object lock; //Synchronisatie object


  public Kok()
  {
    piet = new Kelner("Piet",this);
    jan = new Kelner("Jan",this);
    lock = new Object();
    System.out.println("Klaar voor bereiden");
    
    piet.start();
    jan.start();
  }

  public void krijgOpdracht(String opdracht, Kelner k)
  {
    synchronized(lock) //Wacht tot dat de kok vrij is
    {
      System.out.println(k.getNaam() + " : " + opdracht);
      k.actieKok("Schop uit keuken: " + k.getNaam());
    }
  }


  public static void main(String[] args)
  {
    Kok kok = new Kok();
  }
}
--------------080406010105090207050907
Content-Type: text/plain;
 name="Kelner.java"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="Kelner.java"

public class Kelner extends Thread
{
  private String naam;
  private Kok deKok;

  public Kelner(String eenNaam, Kok eenKok)
  {
    naam = eenNaam;
    deKok = eenKok;
  }

  public void run()
  {
    while(true)
    {
      try
      {
         double sleepTime = Math.random() * 2000;
         Thread.sleep((long)sleepTime);
         deKok.krijgOpdracht("Feed me!" + sleepTime, this);
      }
      catch (InterruptedException ie) //Negeren
      {
      }
    }
  }
  
  public void actieKok(String actie)
  {
    System.out.println(actie);
  }
  
  public String getNaam()
  {
    return naam;
  }
}
--------------080406010105090207050907--
Re: [java]multithreading vraagje/probleem
#3220
Author: Passero
Date: Sun, 25 Jan 2004 18:04
27 lines
2544 bytes
"Nicolas Barbier" <reply@in.group.invalid> schreef in bericht
news:4013fb13$0$1121$6c56d894@feed0.news.be.easynet.net...

>
> Je start twee kelnerthreads die meteen weer stoppen omdat je de run-method
> niet hebt veranderd, maw alles gebeurt in de eerste thread. Het is dan
> moeilijk om nog te spreken van multithreading. Misschien toch het
hoofdstuk
> over multithreading nog eens herlezen (-;.
>

Nu is het gelukt (zonder te herlezen :p). Kheb nog een klasse bijgemaakt die
het order bijhoudt. Allemaal statische attributen en methoden. De kelner
vraagt dan aan die klasse of de order mag genomen worden (dat er niet 2maal
hetzelfde order genomen word) en voert die uit, dan zet hij een boolean op
false zodanig dat de andere kelner weer dat hij het order niet mag nemen. De
kok controleert of 1 van de kelners vrij is en of het order al genomen is.
Als dat zo is dan zet hij die boolean op true en dan zet hij ook een nieuw
order. De eerste kelner die nu vrijkomt kijkt naar de orders en ziet dat er
al dan niet een nieuwe order is en neemt die dan als het een nieuwe is en nu
gebeurt het wel dat 1 kelner 2 orders of meer na elkaar uitvoert.

> -- 
> Nicolas Barbier
> Protecting innovation against patent inflation
<url:http://swpat.ffii.org/>
Re: [java]multithreading vraagje/probleem
#3033
Author: Andy Georges
Date: Wed, 28 Jan 2004 14:53
30 lines
2747 bytes
Hello,

> Nu is het gelukt (zonder te herlezen :p). Kheb nog een klasse bijgemaakt
> die het order bijhoudt. Allemaal statische attributen en methoden. De
> kelner vraagt dan aan die klasse of de order mag genomen worden (dat er
> niet 2maal hetzelfde order genomen word) en voert die uit, dan zet hij een
> boolean op false zodanig dat de andere kelner weer dat hij het order niet
> mag nemen. De kok controleert of 1 van de kelners vrij is en of het order
> al genomen is. Als dat zo is dan zet hij die boolean op true en dan zet
> hij ook een nieuw order. De eerste kelner die nu vrijkomt kijkt naar de
> orders en ziet dat er al dan niet een nieuwe order is en neemt die dan als
> het een nieuwe is en nu gebeurt het wel dat 1 kelner 2 orders of meer na
> elkaar uitvoert.

Het lijkt alsof hier een datarace in zal zitten. Kun je dat eens proberen
uit te voeren op een multiprocessor? Je moet ervoor zorgen dat de
datastructuren die gemeenschappelijk geaccessed worden beschermd worden
door voldoende synchronisatie.

mvg,
Andy

-- 
--
==========================================================================
Parallel Information Systems Group - Dept. ELIS - Ghent University
St. Pietersnieuwstraat 41, 9000 Ghent, Belgium
Phone: +32-9-264.33.99,   Fax: +32-9-264.35.94
E-mail: andy.georges@elis.ugent.be 
==========================================================================
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads