说,我已javafx.concurrent.Task
嵌套到Thread
,即:
Task task = new Task();
Thread thread = new Thread(task);
thread.start();
如何在这种情况下暂停和/或停止执行task
nad恢复工作?
答案 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();
}
}
}
}