Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: säikeen pysäytys

Sivun loppuun

Matso [16.07.2007 10:48:19]

#

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?

_Pete_ [16.07.2007 11:11:40]

#

Tutki miten toimii wait() / notify() ... Tuolla sen saa toimimaan.

Mobel [16.07.2007 11:37:51]

#

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.

_Pete_ [16.07.2007 12:04:26]

#

sleep on eri asia kun pause.

Tässä nyt on ilmeisesti tarkoitus pistää threadi "pysähdyksiin" (wait()) ja sitten myöhemmin jatkaa (notify()) ?

tesmu [16.07.2007 12:36:40]

#

Järkevästi ajateltuna se voisi olla esim Thread.pause();

Threadeihin varmaankin löytyy jokin manuaali...

_Pete_ [16.07.2007 12:45:34]

#

Järkevästi ajateltuna API:sta (http://java.sun.com/javase/6/docs/api/java/lang/Thread.html) kun katsoo, Thread.pause() metodia ei ole. Sen lisäksi tuolta huomaa että suspend/stop jne ovat depracoituja. Tästä syystä ainoa tapa toteuttaa pause on tuolla wait() / notify() mekanismillä, tässä yksi esimerkki:

http://www.exampledepot.com/egs/java.lang/PauseThread.html

Matso [16.07.2007 12:52:11]

#

Pete on ihan oikeassa siitä mitä haen takaa. Täytyy nyt vaan tajuta ton wait() ja notify():n toiminta, tuntuu niin monimutkaselta :F

_Pete_ [16.07.2007 14:02:48]

#

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!");
  }
}

Matso [16.07.2007 18:04:40]

#

Sain jo toimimaan. Kiitos vastauksista.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta