最近在项目里一直在用jdesktop的swingworker(已经合入JDK 6),是个不错的swing线程库。今天需要在界面里cancel一个swingworker。研究了一下午,结合swingworker的文档、源代码和自己的代码实验,以下是两种安全cancel一个swingworker的方法

方法一,使用isCancelled:

protected Object doInBackground() throws Exception {
    while (!isCancelled()) {
       ...
    }

    return null;
}

需要cencel时调用swingworker.cancel(false),不中断线程,只置cancel标记。

方法二,使用sleep:

protected Object doInBackground() throws Exception {
    while (running) {
        ...
        sleep(30);
    }

    return null;
}

需要cencel时调用swingworker.cancel(true),在sleep处中断线程。切记,不需要捕捉sleep抛出的InterruptedException,swingworker会处理该异常。