Javafx 2 如果任务线程本身被阻塞,那么它如何取消呢?(Java7,JavaFX2)

Javafx 2 如果任务线程本身被阻塞,那么它如何取消呢?(Java7,JavaFX2),javafx-2,java-7,Javafx 2,Java 7,我有两条线;任务线程,背景线程 任务线程 “接收数据”信号量上的块 synchronized (receiveSemaphore) { while (!dataIsReady) { try { receiveSemaphore.wait(); } catch (InterruptedException e) { } } ... } 背景线索 通知所有等待“接收数据”信号的线程 receiveSema

我有两条线;任务线程,背景线程

任务线程 “接收数据”信号量上的块

synchronized (receiveSemaphore) {
    while (!dataIsReady) {
        try {
            receiveSemaphore.wait();
        } catch (InterruptedException e) {
        }
    }
    ...
}
背景线索 通知所有等待“接收数据”信号的线程

receiveSemaphore.notifyAll();
不幸的是,就像在生活中一样,事情有时会出错,BackgroundThread从不执行通知等待线程的语句。 当用户厌倦了等待时,如何取消

我的JavaFX2UI上有一个取消按钮-但是接下来呢? 在JavaFX2中,所示的示例中只有一个线程在循环中运行并检查isCancelled()标志


同样,如果任务线程本身被阻塞,那么它如何取消呢?

当按下“取消”按钮时,对任务调用“取消”。如果任务正在等待,这将中断任务,执行将流向InterruptedException块,您可以在其中检查中断原因是否为cancel调用,如果是,则从任务的调用方法返回,从而有效地取消和结束任务

您的示例实际上与中标题为“带有进度通知和阻止调用的简单循环”的示例非常相似,但您的示例更简单,因为没有涉及循环,所以您只需要担心阻止调用

在幕后,当您在任务上调用cancel时,会向
任务
线程发送一条消息,以在线程上生成
中断异常

下面是一些示例代码

// Task cancel button logic.
cancelButton.setOnAction(new EventHandler<ActionEvent>() {
    @Override public void handle(ActionEvent t) {
        task.cancel();
    }
})
....
// Task call method logic
synchronized (receiveSemaphore) {
    while (!dataIsReady) {
        try {
            receiveSemaphore.wait();
        } catch (InterruptedException e) {
            if (isCancelled()) {
                return;
            }
        }
    }
    ...
}
//任务取消按钮逻辑。
cancelButton.setOnAction(新的EventHandler(){
@重写公共无效句柄(ActionEvent t){
task.cancel();
}
})
....
//任务调用方法逻辑
已同步(接收信号量){
而(!dataIsReady){
试一试{
receiveSemaphore.wait();
}捕捉(中断异常e){
如果(isCancelled()){
返回;
}
}
}
...
}

谢谢,一如既往。信号量与Task位于不同的类中,但位于同一线程上-由call()调用。显然,我在课堂上使用的这种方法是不必要的void cancel(){synchronized(receiveSemaphore){dataIsReady=false;receiveSemaphore.notifyAll();}`