Yritän pausettaa threadin ja jatkaa sitä myöhemmin, mutta ei onnistu. Eli tällasta yritän:
boolean threadRun = true; public void start(){ threadRun = true; thread.start(); } public void pause(){ threadRun = false; } public void run(){ while(threadRun){ //Suoritetaan... } }
Eli kun kutsun pause():a, niin se ei enää periaatteessa tee tota run():in koodia, mutta sitten en saa sitä millän alotettua uudelleen. Olen kokeillut tohon start():iin vaikka minkälaista koodia, niin ei vaan auta :F. Mites täs sais toimiin?
Tutki miten toimii wait() / notify() ... Tuolla sen saa toimimaan.
Mielestäni sleep() on standardin mukaisempi(en tosin varma ole, mutta itse olen sitä käyttänyt). Ja sleep() on syytä laittaa try-catch blokin sisään.
Sitten vielä esimerkki:
public void run(){ while(true){ //tähän kaikki säikeen tapahtumat koordX++; //esim. try { Thread.sleep(65); //odotellaan 65ms }catch (InterruptedException e) {} //tämä päivittää piirtopinnan jos kuvitellaan, että siirretään //vaikkapa kuvaa koordX:n avulla. kuva siis liikkuu oikealle koko ajan repaint(); } }
Nyt tässä siis kasvatellaan koordX:ää yhdellä ja päivitetään piirtopintaa 65ms välein.
sleep on eri asia kun pause.
Tässä nyt on ilmeisesti tarkoitus pistää threadi "pysähdyksiin" (wait()) ja sitten myöhemmin jatkaa (notify()) ?
Järkevästi ajateltuna se voisi olla esim Thread.pause();
Threadeihin varmaankin löytyy jokin manuaali...
Järkevästi ajateltuna API:sta (http://java.sun.com/javase/6/docs/api/java/lang/
Pete on ihan oikeassa siitä mitä haen takaa. Täytyy nyt vaan tajuta ton wait() ja notify():n toiminta, tuntuu niin monimutkaselta :F
Tässä kokonainen esimerkki, jospa se jotain auttaa :)
Tuossa siis main threadissa kontroloidaan WorkerThread toimintaa togglePause() ja sleeppien avulla ....
/** */ public class PauseExample { public static class WorkerThread implements Runnable { private boolean _doPause; private boolean _doRun; public WorkerThread() { _doPause = false; _doRun = true; } /** */ public void start() { Thread t = new Thread(this); t.start(); } /** */ public synchronized void togglePause() { _doPause = !_doPause; if (!_doPause) { notify(); // wait() will continue... } } /** */ public void doStop() { _doRun = false; if (_doPause) { togglePause(); } } /** * @see Thread#run() */ public void run() { int work = 0; System.out.println("WorkerThread starting!"); while (_doRun) { while (_doPause) { synchronized (this) { try { System.out.println("Worker paused!"); wait(); System.out.println("Worker pause over!"); } catch (InterruptedException e) { // dont care } } } if (_doRun) { // do work work++; System.out.print(" ! "); System.out.flush(); try { Thread.sleep(100); } catch (InterruptedException e) { // dont care } } } System.out.println("WorkerThread finished: " + work); } // run() } // WorkerClass public static void main(String[] args) throws InterruptedException { System.out.println("Main thread start!"); WorkerThread worker = new WorkerThread(); worker.start(); // start worker Thread.sleep(5000); // work 5 secs worker.togglePause(); // pause on Thread.sleep(2000); // pause 2 secs worker.togglePause(); // pause off Thread.sleep(5000); // work 5 secs worker.doStop(); // stop worker Thread.sleep(3000); // just wait 3 secs System.out.println("Main thread end!"); } }
Sain jo toimimaan. Kiitos vastauksista.
Aihe on jo aika vanha, joten et voi enää vastata siihen.