Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Izračunavanje za tačno određeno vreme

[es] :: Java :: Izračunavanje za tačno određeno vreme

[ Pregleda: 3955 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Texas Instruments

Član broj: 227540
Poruke: 272
95.180.72.*



+61 Profil

icon Izračunavanje za tačno određeno vreme16.06.2010. u 02:23 - pre 168 meseci
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.
 
Odgovor na temu

grizzly
Beograd

Član broj: 7978
Poruke: 262



+4 Profil

icon Re: Izračunavanje za tačno određeno vreme16.06.2010. u 09:29 - pre 168 meseci
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...
 
Odgovor na temu

Texas Instruments

Član broj: 227540
Poruke: 272
95.180.72.*



+61 Profil

icon Re: Izračunavanje za tačno određeno vreme16.06.2010. u 12:04 - pre 168 meseci
Nisam naznačio da tu metodu ustvari dobijam da implementiram iz nekog interfejsa i ne mogu da je menjam, tako da ima samo jedan long argument i još neke druge. :(
 
Odgovor na temu

Tulex
Danguba
Novi Sad

Član broj: 170959
Poruke: 121
*.prozone.rs.



Profil

icon Re: Izračunavanje za tačno određeno vreme17.06.2010. u 07:21 - pre 168 meseci
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.
 
Odgovor na temu

Texas Instruments

Član broj: 227540
Poruke: 272
95.180.72.*



+61 Profil

icon Re: Izračunavanje za tačno određeno vreme17.06.2010. u 12:22 - pre 168 meseci
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.
 
Odgovor na temu

Tulex
Danguba
Novi Sad

Član broj: 170959
Poruke: 121
*.prozone.rs.



Profil

icon Re: Izračunavanje za tačno određeno vreme17.06.2010. u 12:52 - pre 168 meseci
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.


 
Odgovor na temu

bantu

Član broj: 38670
Poruke: 305
89.111.240.*



+27 Profil

icon Re: Izračunavanje za tačno određeno vreme17.06.2010. u 13:40 - pre 168 meseci
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]
 
Odgovor na temu

MMX
Miloš Malović
Platform engineer, Supplyframe
Beograd

SuperModerator
Član broj: 2423
Poruke: 2105
188.120.96.*

Jabber: mmx@elitesecurity.org
ICQ: 98797759
Sajt: www.mmx.rs


+11 Profil

icon Re: Izračunavanje za tačno određeno vreme19.06.2010. u 10:14 - pre 168 meseci
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.
↑ ↑ ↓ ↓ ← → ← → B A B A [select] [start]
 
Odgovor na temu

Tulex
Danguba
Novi Sad

Član broj: 170959
Poruke: 121
*.static.kdsinter.net.



Profil

icon Re: Izračunavanje za tačno određeno vreme19.06.2010. u 10:35 - pre 168 meseci
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.
 
Odgovor na temu

MMX
Miloš Malović
Platform engineer, Supplyframe
Beograd

SuperModerator
Član broj: 2423
Poruke: 2105
188.120.96.*

Jabber: mmx@elitesecurity.org
ICQ: 98797759
Sajt: www.mmx.rs


+11 Profil

icon Re: Izračunavanje za tačno određeno vreme19.06.2010. u 18:48 - pre 168 meseci
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;
↑ ↑ ↓ ↓ ← → ← → B A B A [select] [start]
 
Odgovor na temu

Texas Instruments

Član broj: 227540
Poruke: 272
95.180.72.*



+61 Profil

icon Re: Izračunavanje za tačno određeno vreme19.06.2010. u 19:33 - pre 168 meseci
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.
 
Odgovor na temu

Tulex
Danguba
Novi Sad

Član broj: 170959
Poruke: 121
*.static.kdsinter.net.



Profil

icon Re: Izračunavanje za tačno određeno vreme19.06.2010. u 20:10 - pre 168 meseci
@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.
 
Odgovor na temu

MMX
Miloš Malović
Platform engineer, Supplyframe
Beograd

SuperModerator
Član broj: 2423
Poruke: 2105
188.120.96.*

Jabber: mmx@elitesecurity.org
ICQ: 98797759
Sajt: www.mmx.rs


+11 Profil

icon Re: Izračunavanje za tačno određeno vreme20.06.2010. u 06:59 - pre 168 meseci
Aham, ok. Onda se nismo dobro razumeli. :)
↑ ↑ ↓ ↓ ← → ← → B A B A [select] [start]
 
Odgovor na temu

[es] :: Java :: Izračunavanje za tačno određeno vreme

[ Pregleda: 3955 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.