2

我有两个线程;任务线程,背景线程。

TaskThread 在“接收数据”信号量上阻塞。

synchronized (receiveSemaphore) {
    while (!dataIsReady) {
        try {
            receiveSemaphore.wait();
        } catch (InterruptedException e) {
        }
    }
    ...
}

BackgroundThread 通知所有等待“接收数据”信号量的线程

receiveSemaphore.notifyAll();

不幸的是,在生活中,事情有时会出错,BackgroundThread 永远不会执行通知等待线程的语句。当用户厌倦了等待时,如何取消?

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

http://docs.oracle.com/javafx/2/api/javafx/concurrent/Task.html

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

4

1 回答 1

1

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

您的示例实际上与任务文档中标题为“带有进度通知和阻塞调用的简单循环”的示例非常相似,但是您的示例更简单,因为不涉及循环,因此您只需要担心阻塞调用。

在幕后,当您在任务上调用取消时,会向线程发送中断以在Task线程上生成InterruptedException

这是一些示例代码。

// 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;
            }
        }
    }
    ...
}
于 2013-03-19T23:23:16.037 回答