[Java lista] szalkezeles

Maglódszki Viktor bocios at citromail.hu
2007. Jan. 29., H, 12:01:14 CET


Sziasztok !

Pár napja emlitettem egy szálkezeléssel kapcsolatos problémát.
Sajnos azóta sem jutottam elöbb.

Most kóddal mindennel leirom, remélem most nem az lesz valaki gondja, hogy hosszú a levél :))

Az egészből 2db általam irt szál a lényeges.

Az egyik:

public class Listaz extends Thread {

private boolean futhat;

public Listaz() {
futhat = true;
}

public void start() {
        if (t == null) {
            t = new Thread(this);
            t.setPriority(Thread.MAX_PRIORITY);
        }
        t.start();
    }

public void run() {
if (futhat) {
 HashMap hm = itt kap SOAP-on egy HashMap-et

 Iterator i = hm.keySet().iterator;

 int i = 0;

 while (i.hasNext) {

    String partnerName  = (String)hm.get("partnername");
    String id = (String)hm.get("id");

    table.setValue(id,0,i);
    table.setValue(partnerName,1,i);
    i++;

 }
}

}

mystopp();

}

mystopp() {
 futhat = false;
}

ez önmagában remekül feltölti a táblát...
lefutás után (netbeans profilerből is látva) a szál megáll tehát nem fut tehát sikerül megállitani
profiler is mutatja ...


másik:

a program inditásakor inditok egy Timer-t
CheckTask task = new CheckTask();
Timer t = new Timer();
t.schedule(task,1000,10000); //10mp-kent fut!

a CheckTask-ban 1 SOAP lekeres van szinten..

public class CheckTask extends TimerTask {

 if (szal == null) {
            szal = new Thread(this);
            szal.setPriority(Thread.MIN_PRIORITY);
            szal.yield(); //hátha igy elengedi a feltöltő szálat ami eleve nagyobb prioritással bir
        }
        szal.start();
}

public void run() {
futhat = true; //azert itt true mert a timer ezt hivja meg 10mp-ként és nem a start()-ot
if (futhat) {
//soap keres
//semmi extra csak 1 szamot kap vissza db-ből
}
futhat = false;
}

}
profiler szerint ez a TimerTask is rendesen teszi a dolgát
10mp-ként alive, majd dead
tehát ez sem marad futva és nem eszi az erőforrásokat feleslegesen

a gond:

az első szál ami feltölt egy gomb megnyomására inditható el és lekér mondjuk 500sort az adatbázisból majd ezt beleteszi táblába..
System.err.println()-al mindig kiiratom ciklusban az i változót hogy lássam fut-e a ciklus
a TimerTask-ban is van 2 System.err.println() egyik kiirja, hogy "fut" a másik, hogy "megállt" ..
ezt látom is debug-ban:
jönnek a számok (az i változó ahogy növeli a ciklus) majd 10mp-ként: "fut" , "megállt"
akkor jelentkezik a problémám, amikor kiirta, hogy "megállt" ez után kb 5-6mp-ig a ciklus sem fut
aztán megint irja a számláló (az i változó), hogy hol tart a ciklus megint jön a TimerTask: "fut" "megállt"

pl:
5
6
7
8
fut
megállt
//ilyenkor vár a program 5-6mp-t addig a ciklus sem lép
9
10
11
fut
megállt
//megint áll a program


valamelyik szál "megfogja a programot" vagy ilyesmi?

előre is köszönöm !










--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: http://javagrund.hu/pipermail/javalist/attachments/20070129/ca0d8055/attachment-0001.html 


További információk a(z) Javalist levelezőlistáról