如何暂停和/或停止javafx.concurrent.Task?

时间:2015-06-13 18:43:55

标签: java javafx

说,我已javafx.concurrent.Task嵌套到Thread,即:

Task task = new Task();
Thread thread = new Thread(task);
thread.start();

如何在这种情况下暂停和/或停止执行task nad恢复工作?

1 个答案:

答案 0 :(得分:0)

除了在Thread类上使用已弃用的suspend()和resume()方法之外,没有简单的方法。

如果您确定您的任务没有输入可用的同步代码

否则你必须在你的任务中有停止点,你检查任务是否已经停止,如果是,则在某个对象上调用wait()来阻塞线程。然后,对对象进行通知的调用将唤醒线程并恢复。下面是该方法的一大段伪代码。

请注意,要使其按预期工作,您需要在任务代码中经常检查暂停变量。

class MyTask{
    volatile boolean halt = false;
    Object o  = new Object();
    public void run(){
        while(notDone) {
            if (halt) halt();

        }
    }

    private halt(){
        synchronized (o){o.wait()}
    }


    public resume(){
        halt = false;
        synchronized (o){o.notify()}
    }
    public suspend(){
        halt=true;
    }
}
import java.io.IOException;
public class TestThread {

static class PausableRunnable implements Runnable{
    volatile boolean shouldHalt = false;
    private final Object lock=new Object();
    public void run(){
        while(true){
            if(shouldHalt)halt();
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.print(".");
        }
    }
    private void halt(){
        synchronized (lock){
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }


    void pause(){
        shouldHalt = true;
    }

    void resume(){
        synchronized (lock){
            shouldHalt=false;
            lock.notify();
        }
    }
}

public static void maipn(String[] args) throws IOException {
    PausableRunnable pr = new PausableRunnable();
    Thread t = new Thread(pr);
    t.start();

    while(true) {
        char c = (char) System.in.read();
        if (c == 'p') {
            System.out.println("Pausing");
            pr.pause();
        }
        if (c == 'r') {
            System.out.println("Resuming");
            pr.resume();
        }
    }
}
}