• 12 odgovora
  • 6.306 pregleda
Izračunavanje za tačno određeno vreme 16.06.2010. u 02:23 · pre 199 meseci #1
Kako da realizujem da mi se izračunavanje neke metode iz klase koja bi imala i rekurzivne pozive, prekine nakon određenog vremena i vrati do tog trenutka izračunatu vrednost?
Metodi bi se prosledio jedan long kao argument koliko maksimalno vremena se dozvoljava za računanje.
Re: Izračunavanje za tačno određeno vreme 16.06.2010. u 09:29 · pre 199 meseci #2
Pa prosledi jos jedan long koji je pocetno vreme u milisekundama i proveravaj u svakom pozivu koliko je proslo kad prodje vise pocni da vracas vrednost...
Re: Izračunavanje za tačno određeno vreme 17.06.2010. u 07:21 · pre 199 meseci #4
Prvo sto mi pada na pamet jeste poseban thread i poziv te metode u tom thread-u.
Rezultat izracunate vrednosti smestaj u neku static promenljivu koja bi trebala biti i sinchronized.

U drugom, parent thread-u meris vreme i kad istekne samo ubijes ovaj thread sto pokrece tvoju metodu.
Re: Izračunavanje za tačno određeno vreme 17.06.2010. u 12:22 · pre 199 meseci #5
Tako mi je nešto i savetovano, ali nisam siguran kako bi to trebalo da se uradi. Je li bi mogao da napišeš taj deo sa nitima kako bi izgledao, a da recimo metoda samo upisuje u nekoj petlji broj u neku static promenljivu, čisto radi simulacije tog izračunavanja.
Re: Izračunavanje za tačno određeno vreme 17.06.2010. u 12:52 · pre 199 meseci #6
Evo nesto na brzinu.
Prvo ti treba tvoja klasa npr. MyThread koja ce nasledjivati klasu Thread
Code:

public class MyThread extends Thread {
    
    public static int value = 0;
    
    public void run() {
        
        // Ovde pozoves tu metodu koja ce nesto da racuna
        
        // Ovde takodje mozes i uzimati rezultat te metode i upisivati u neku
        // staticki atribut...
        // npr. ova klasa moze da ima neki staticki atribut value
        
        
    }

}


U ovoj metodi run napises sve sta hoces da ti se izvrsava dok je taj thread ziv.

Sledeci korak je da negde u svom kodu kreiras instancu ove svoje klase MyThread i pokrenes start();
Code:

     MyThread t = new MyThread ();
     t.setDaemon(true);
     t.start();

I onda cekas da to vreme koje si odredio istekne.. i zatim ubijes taj thread.

Ubijanje thread-a je zeznut deo. Postoje metode stop(), suspend(), destroy() ali se ne preporucuju.. nisu napravljene u startu kako treba.
Ali najcesce se desi da nemas drugog resenja.
Dakle pozoves sledece
Code:

      t.suspend();
      t.stop();

i zatim mozes da procitas vrednost koju si unosio u staticki atribut value
Code:

int val = MyThread.value;


Ovo je daleko od idealnog, ali ce ti uraditi posao.


Re: Izračunavanje za tačno određeno vreme 17.06.2010. u 13:40 · pre 199 meseci #7
Mozda moze ovako. Na brzinu sam to sklepao treba uzeti sa rezervom.

Code:

import java.util.Timer;

public class MainClass {
    
    private boolean running = true;

    public int racunaj() {
        int count = 0;
        TajmerTask task = new TajmerTask(this);
        Timer t = new Timer();        
        t.schedule(task, 1000);        
        while (isActive()) {
            count++;
        }
                 t.cancel();
        return count;
    }

    public synchronized boolean isActive() {
        return running;
    }

    public synchronized void setState(boolean running) {
        this.running = running;
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        
        MainClass m = new MainClass();    
        System.out.println(m.racunaj());
        

    }

}


Code:

import java.util.TimerTask;



public class TajmerTask extends TimerTask{
    
    private MainClass m;
    
    public TajmerTask(MainClass m) {
        this.m = m;
    }
        

    @Override
    public void run() {
        m.setState(false);        
    }

}


[Ovu poruku je menjao bantu dana 17.06.2010. u 14:55 GMT+1]
Re: Izračunavanje za tačno određeno vreme 19.06.2010. u 10:14 · pre 199 meseci #8
Puno bolje rešenje je ovo što je bantu preporučio. Nikada ne treba da ubijaš nit pomoću gore navedenih metoda. Uvek se vrti u nekoj petlji i setuj vrednost variable na false kada želiš da izađeš iz nje, a nit da se završi.
Potpis
↑ ↑ ↓ ↓ ← → ← → B A B A [select] [start]
Re: Izračunavanje za tačno određeno vreme 19.06.2010. u 10:35 · pre 199 meseci #9
Slazem se da je uvek bolja while petlja nego ubiti neki thread.
Problem je sto cesto nisi u mogucnosti napraviti tako nesto.
Inace cisto da bi videli da je u pitanju ista stvar evo ispravke MyThread klase
Code:

public class MyThread extends Thread {
    
    public static int value = 0;
    public boolean running = false;
    
    public void run() {
        
        while(running) {
          // U ovoj while petlji iznova i iznova pozivas tu svoju metodu 
          // dok god iz parent thread-a ne kazes da je running = false

        }
        
        
    }

}


Problem o kom sam govorio je kad jednom udjes u tu metodu i vise nisi u stanju da izadjes iz nje dok se thread ne ubije.
Znaci nema while petlje, nema iteracije.. udjes u metodu i cekas da se proces zavrsi ili da se thread ubije.
Mnogo puta mi se bas to desilo kad smo imali metodu koja se mogla zaglupiti i thread ne izlazi iz nje.
Jedino resenje je ubiti thread spolja nakon nekog vremena.
Re: Izračunavanje za tačno određeno vreme 19.06.2010. u 18:48 · pre 198 meseci #10
Grešiš. Metoda se "zaglupi" zato što posle nekog vremena JVM kešira vrednost promenljive running, pa umesto false može se desiti da prikaže (uzme) vrednost true. Problem rešavaš pomoću ključne reči volatile koja sprečava keširanje. Deklaracija promenljive bi trebalo da izgleda ovako:

public volatile boolean running = false;
Potpis
↑ ↑ ↓ ↓ ← → ← → B A B A [select] [start]
Re: Izračunavanje za tačno određeno vreme 19.06.2010. u 19:33 · pre 198 meseci #11
Ljudi, hvala na pomoći. Sviđa mi se ovo rešenje koje je ponudio bantu, samo imam problem sada što se ta nit izvrši za jedan poziv i prilikom sledećeg poziva ne računa se ponovo.
Kako da izmenim da se ta MainClass kreira jednom, a da za svaki poziv
Code:
m.racunaj(long timeToRun);
izvršava toliko vremena koliko je potrebno.
Re: Izračunavanje za tačno određeno vreme 19.06.2010. u 20:10 · pre 198 meseci #12
@MMX nisi me razumeo. Nema while petlje, nema promenljive running...

imas poseban thread i u njenoj run metodi imas poziv neke metode iz neke externe biblioteke nad kojom ti nemas nikakvu kontrolu.
Desava se da ta metoda zaglupi iz samo njoj poznatih razloga ili izvrsavanje predugo traje.
Da tvoja aplikacija ne bi cekala doveka da se to izvrsi jedino sto mozes uraditi jeste ubiti thread i obavestiti korisnika da akcija nije uspela.
Imao sam u par navrata takvu situaciju.
Inace, u pravu si sto se tice kesiranja ali to je druga prica i nema veze sa problemom koji sam ja gore naveo.
Re: Izračunavanje za tačno određeno vreme 20.06.2010. u 06:59 · pre 198 meseci #13
Aham, ok. Onda se nismo dobro razumeli. :)
Potpis
↑ ↑ ↓ ↓ ← → ← → B A B A [select] [start]
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme