[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