hoe je een statement blokkeert van de uitvoering tot de vorige dagen klaar zijn in Java?

Ik heb twee lijnen:

   display.print(x);//outputs a collection contenet
   LOG.info("Total word count is completed.");

de methodeaanroep op de eerste regel drukt een aantal gegevens uit een verzameling af. Maar terwijl het afdrukken en voordat de log-statement is voltooid, wordt uitgevoerd. Dus de uitvoer ziet eruit als:

...   
a : 6
as : 6
23/06/2012 09:38:01 م sample.testing
INFO: Processing... 0 thread(s) has/have finished
book : 6
had : 6
...

maar het logboek mag alleen worden afgedrukt nadat alle gegevens zijn afgedrukt. waarom dit gebeurt? en hoe het kan worden opgelost?

dat is de afdrukmethode:

 public void print(Map map)
{
    for (Map.Entry current : map.entrySet())
    {
        System.out.println(String.format("%s : %d", current.getKey(), current.getValue()));
    }
    System.out.println();
}

bewerking 2: Ik geef ThreadClass.getCol() door aan de afdrukmethode. ThreadClass.getCol() retourneert een verzameling uit ThreadClass waar veel threads deze verzameling bijwerken. Het is gesynchroniseerd en ik stuur er een kopie van terug.

0
Overigens komt je voorbeelduitvoer niet overeen met de code die je ons hebt laten zien ...
toegevoegd de auteur Oliver Charlesworth, de bron
@ OliCharlesworth verontschuldigt zich daarvoor, bewerkt.
toegevoegd de auteur Sami, de bron

5 antwoord

Vermoedelijk outputter.print vuurt een thread af (of misschien meerdere threads), wat is/zijn asynchroon schrijven naar System.out (of waar uw tekstuitvoer naartoe gaat).

De manier om dit op te lossen is om te wachten totdat deze threads al hun werk hebben voltooid. Aangezien u ons de code voor die methode niet hebt getoond, kan ik u daar niet echt mee helpen!

1
toegevoegd
@Sams in dat geval is het waarschijnlijk dat er twee threads deze code tegelijk aanroepen, je moet synchroniseren. Zie mijn antwoord. (anders hoeft u alleen de uitvoerbak door te spoelen)
toegevoegd de auteur user949300, de bron
de printmethode maakt eigenlijk geen threads, het drukt gewoon waarden af.
toegevoegd de auteur Sami, de bron

Probeer een flushbewerking uit te voeren op de uitvoerder na uw afdrukinstructie.

0
toegevoegd

Als @Oli Charlesworth correct is, en outputter.print() een thread afvuurt, zullen we die code moeten zien en moeten uitzoeken hoe hij moet wachten tot hij terugkomt.

Een andere mogelijkheid is dat outputter.print() niets speciaals doet, maar dat twee verschillende threads deze code tegelijk aanroepen. In dat geval is de eenvoudigste oplossing om deze code te synchroniseren. bijv. als het een methode is:

public **synchronized** void outputterPrint() {
   outputter.print(x);//outputs a collection contenet
  //you might want to add some sort of flush here
   outputter.flush();

   LOG.info("Total word count is completed.");
}

Als deze code een skillion-keer wordt genoemd, heeft dit prestatieproblemen. Maar voor zeldzame oproepen is dit veilig en eenvoudig.

0
toegevoegd

er is een probleem met multi-threading, hoewel ik niet zeker weet waarom je de volledige code niet hebt geplaatst. U zou uw handen vies kunnen maken door de juiste thread te "krijgen" en een NotifyAll() toe te voegen en vervolgens een andere thread te laten uitvoeren door op deze melding te wachten.

OR you could just place your

LOG.info("Total word count is completed.");

aan het einde van uw print (...) methode.

Comment if you want an abstract answer for your original question "how to block a statement from execution till the previuos has finished in java?"

0
toegevoegd

outputter.print fires starts a porcess or a thread. If outputter.print(x) returns a Process, you could use .waitFor() to wait for the end. But its not enough information to answer your question. Perhaps theres a method which you tell, if its ready. If you wanna do a dirty trick, use Thread.currentThread().sleep(1000)

Maar het is geen goede oplossing

0
toegevoegd