在这种情况下我想停止SwingWorker时我怎么了?

时间:2019-03-19 18:00:10

标签: java multithreading swingworker

arr.forEachIndexed { index, row -> 
    if (index in row.indices) {
        println("value at [$index, $index]: ${row[index]}")
    }
}

并采用表单:

public class Worker extends SwingWorker<Integer, String> {
private JLabel screen;

    public Worker(JLabel screen) {
        this.screen = screen;
    }

    @Override
    protected Integer doInBackground() throws Exception {
        for (; ; ) {
            publish(String.valueOf(Calendar.getInstance().getTimeInMillis()));
        }
    }

    @Override
    protected void process(List<String> chunks) {
        screen.setText(chunks.get(0));
    }
}

我试图用Tread编写相同的代码,但是它也不起作用。单击stopButton之后,控制台输出:

  

true

     

true

因此,工作人员已完成操作,但程序仍继续显示毫秒。什么是死亡后的生活?并且在使用Thread的情况下:方法isAlive()返回“ false”。

1 个答案:

答案 0 :(得分:0)

根据您的代码,看起来您需要一个带有循环的工作程序来保持运行,直到主线程告诉它停止运行为止,这是通过worker.cancel(true);完成的。问题是您正在取消它,但是没有做任何信号通知循环本身停止迭代。要解决此问题,您应该更改

for (; ; ) {
    publish(String.valueOf(Calendar.getInstance().getTimeInMillis()));
}

while(!isCancelled()){
    publish(String.valueOf(Calendar.getInstance().getTimeInMillis()));
}

请注意Java文档中“ isCancelled”的措辞:

  

isCancelled()

     

如果此任务在正常完成之前被取消,则返回true。   由于循环永远不会自行关闭,因此永远不会正常完成。