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.