[JAVA] 2 threads

Pagina: 1
Acties:
  • 106 views sinds 30-01-2008
  • Reageer

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
Ik zat een beetje vast met volgende java-applicatie..

volgende situatie:

Classes : PutAndTake (Frame)
PATLabel (de 2 buitendste componenten)
PATCanvas (de middelste component)

Op beide PATLabels loopt een Thread.
Gedurende 300 milliseconden zie je het woordje “PUT” of “TAKE”.
Daarna wacht je een random tijd tussen 1 en 5 seconden (voor beide threads verschillend).

PUT : We voegen een OvalShape-object toe achteraan onze array. dus gewoon een oval in de canvas.
TAKE : We nemen het laatste OvalShapeG-object uit onze array.
Dit betekent dat we moeten controleren dat de “put” en “take” niet gelijktijdig gebeurt. (synchronized)
En dat we moeten controleren dat we niet meer elementen in onze array proberen te steken dan mogelijk en dat als onze array leeg is we geen elementen er mogen uithalen.

Dus eigenlijk moeten we met 2 threads, verschillende dingen laten uitvoeren (put & take).
Maar we kunnen maar 1 run-method gebruiken.

Op welke manier zou dit opgelost moeten worden??

  • kasper_vk
  • Registratie: Augustus 2002
  • Laatst online: 08-04-2025
Door de put en take methoden synchronized te maken, geloof ik.

Dus bv : public void synchronized blaat() {}

Hierdoor kunnen niet 2 threads tegelijk in een synchronized methode van 1 object komen; maar 100% zeker weet ik het niet.

The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny...'


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
ja, ok...

zover was ik ook al, maar in het ene geval moet hij een oval wegnemen, en in het andere geval moet hij er eentje bijplaatsen.

hoe moet ik dan controleren welke thread in de run-method komt?
kan je dit opvangen a.d.h van getName()?

Heeft iemand misschien een duidelijk voorbeeld waarin dit uitgelegt staat?

  • nxt
  • Registratie: November 2001
  • Laatst online: 12-06 10:00

nxt

-FoX- schreef op 30 May 2003 @ 11:01:
....hoe moet ik dan controleren welke thread in de run-method komt?
kan je dit opvangen a.d.h van getName()?

Heeft iemand misschien een duidelijk voorbeeld waarin dit uitgelegt staat?
volgens mij moet je de threads inderdaad uit elkaar kunnen houden dmv getName()
mits je ze natuurlijk een naam gegeven hebt, (via constructor of m.b.v. de setName(...) method)

  • kasper_vk
  • Registratie: Augustus 2002
  • Laatst online: 08-04-2025
Kijken of ik het goed begrijp:
3 objecten:
- 1 canvas (waarin je ovaaltjes stopt)
- 2 'PATlabels', welke allebei willekeurig put() en take() doen op het canvas

Je wilt dus voorkomen dat de threads tegelijk de acties put() en take() doen, omdat ze anders elkaars werk gaan verprutsen. Da's toch je probleem?

Ik ben geinteresseerd in de code van het canvas, kun je die posten?

Synchronisatie problemen oplossen m.b.v. namen van Threads klinkt overigens niet echt geweldig.

The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny...'


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
Op welke manier kunnen we nu op de JLabels van de class PutandTake een andere tekst plaatsen?

[ Voor 88% gewijzigd door -FoX- op 07-06-2004 10:48 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Wellicht is het handig om twee aparte objecten te maken die weer de patc als parameter mee krijgen. En op die parameter (patc) een synchronized methode aanroepen, danwel voor de 'put', danwel voor de 'take' ?

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
ok, dat zou wel eens kunnen werken ja.

Maar als ik dan die objecten in een array moet stoppen, hoe kan ik daar dan het laatste element uithalen. Of op welke manier kan ik het aantal elementen uit de rij te weten komen.


Ik heb dit proberen op te vangen door: Arrays.asList(array).size()
maar dan geeft hij sowieso altijd de waarde 10 terug..
Ook om te wissen.. is er hetzelfde probleem..

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

arraynaam.size(); ?

Eventueel kan je ook een Stack object gebruiken, die werkt wat handiger als je alleen maar "elementen neer wilt leggen en de bovenste er af halen".

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
size kan je niet toepassen op array
zie javadoc - arrays

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Owja, dat was voor strings, een array :
arraynaam.length
http://java.sun.com/docs/...tml/arrays.doc.html#54000

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
ja, die .length geeft enkel de grootte van de array terug.
En die kennen we reeds.. aangezien we bij de declaratie 10 hebben meegegeven.

We willen het aantal elementen die in de array zitten terugkrijgen...

Of moeten we die array dan op een andere manier declareren misschien?

  • momania
  • Registratie: Mei 2000
  • Laatst online: 22:52

momania

iPhone 30! Bam!

-FoX- schreef op 30 May 2003 @ 15:38:
ja, die .length geeft enkel de grootte van de array terug.
En die kennen we reeds.. aangezien we bij de declaratie 10 hebben meegegeven.

We willen het aantal elementen die in de array zitten terugkrijgen...

Of moeten we die array dan op een andere manier declareren misschien?
Vector misschien?
Is synchronized en heeft first in-last out, als je steeds getElementAt(0) gebruikt. (nadat je natuurlijk de size gechecked hebt ;) )

Neem je whisky mee, is het te weinig... *zucht*


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
momania schreef op 30 May 2003 @ 15:47:
Vector misschien?
Is synchronized en heeft first in-last out, als je steeds getElementAt(0) gebruikt. (nadat je natuurlijk de size gechecked hebt ;) )
Tegenwoordig liever een ArrayList die thread-safe gemaakt is:
Java:
1
List list = Collections.synchronizedList(new ArrayList(...));

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

-FoX- schreef op 30 mei 2003 @ 15:38:
We willen het aantal elementen die in de array zitten terugkrijgen...

Of moeten we die array dan op een andere manier declareren misschien?
Dan moet je geen statisch ding als een array gebruiken, zelf een methode ontwikkelen die kan bepalen hoeveel elementen ook daadwerkelijk 'echt' zijn of een van de andere opslagtypen gebruiken, zoals een Stack, Vector, ArrayList, e.a. :)

Zie o.a. SoulTaker's voorbeeld :)

  • kasper_vk
  • Registratie: Augustus 2002
  • Laatst online: 08-04-2025
Nu ik herhaaldelijk de topicstart en jouw code heb bekeken, lijkt het me een 'standaard' producer/consumer probleem.
Ik wil je niet onderschatten: maar heb je de volgende Java Toturials al eens gelezen:

Threads
http://java.sun.com/docs/...hreads/multithreaded.html
Producer / consumer
http://java.sun.com/docs/...eads/synchronization.html


Je zult uiteindelijk (het frame niet meegeteld) 3 classes nodig hebben:
- 1 voor het label dat de TAKE actie doet (+ eigen Thread)
- 1 voor het label dat de PUT actie doet (+ eigen Thread)
- 1 voor het canvas

Het canvas zal moeten voor zien in 2 synchronized methoden:
Java:
1
2
3
4
5
6
7
synchronized void put( ShapeG shape ) {
    //code die het shape in de array stopt

}
synchronized ShapeG take() {
    //haal een shape uit de array en returnt die
}


De 2 Label-achtige classes hebben ieder hun eigen Thread die (met behulp van jouw 'pauze'-code): 1 van de classes (putLabel) zal na het wachten steeds de methode canvasje.put() aanroepen, het andere Label zal steeds de take-methode gebruiken.

Je zult een teller nodig hebben (in het canvas dus) om te kijken hoeveel shapes je in je array hebt zitten, zodat je de genoemde controles uit kunt oefenen.

The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny...'


  • kasper_vk
  • Registratie: Augustus 2002
  • Laatst online: 08-04-2025
Aanvulling:

die 2 threads (in ieder van de Labels) kun je het beste maken in de constructor van de Labels zelf; je zult de Labels dus de interface Runnable moeten laten implementeren.

In die run-methoden plaats je dan de code die een tijdje wacht en na het wachten de put() danwel take() actie doet.

[ Voor 10% gewijzigd door kasper_vk op 30-05-2003 19:28 ]

The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny...'


  • kasper_vk
  • Registratie: Augustus 2002
  • Laatst online: 08-04-2025
Ik ben benieuwd of je er nog bent uitgekomen. Is het nog gelukt?
Hoe heb je het opgelost?
Wellicht dat je een relevante stuk code / class kan posten :9 .

The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny...'


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Topicstarter
het is min of meer gelukt ja...

De bedoeling was dus om om de beurt een put of een take te doen van een oval op het canvas. Met een random wachttijd tussen 1 en 5 seconden.
Hierdoor zou het dus bijvoorbeeld kunnen dat er 2 puts zijn, en maar 1 take...

[ Voor 93% gewijzigd door -FoX- op 07-06-2004 10:48 ]

Pagina: 1