【问题标题】:Interrupting more SwingWorkers at once一次打断更多的 SwingWorker
【发布时间】:2014-03-14 00:57:08
【问题描述】:

所以我目前正在从 Executer 运行 3 个 SwingWorker:

  1. 使用 htmlunit 从网站收集信息,如果添加了新内容,则会在 GUI 的表格中显示并发送给连接的客户端
  2. 等待客户端连接,如果客户端连接,则将其添加到已连接客户端表中
  3. 每 10 秒通过向客户端发送数据来检查客户端是否仍处于活动状态,并根据此更新已连接客户端的表

主要问题是,如果其中一个 SwingWorkers 被中断(例如由于某些异常或错误)并结束其他 2 个也应该结束,因为它们单独运行毫无意义。

我将这部分代码添加到每个 SwingWorker 的 done() 函数中:

synchronized(lock)
{
   try{
       for (int i = 0; i < threads.size(); i++) {
            try{
                if (threads.get(i)!=null && threads.get(i)!=this){

                      threads.get(i).cancel(true);

                }
            } catch (java.lang.NullPointerException ex) {

            }
          }
   } catch (java.lang.NullPointerException ex) {

   }
}

threads 是 swingworkers 的数组列表,我应该立即结束

这个解决方案对我有用,但我想知道是否有其他更好的解决方案?

【问题讨论】:

    标签: swingworker


    【解决方案1】:

    如何创建一个全局布尔变量并将其用作所有 SwingWorkers 中的标志?

    当该标志为 false 时,每个 SwingWorker 将退出进程..(通常这就是您结束线程的方式..)

    编辑: 这就是我的意思.. 不漂亮,但可能适合您的需要..

    protected Integer doInBackground() throws Exception {
        publish("Start..");
        setProgress(1);
    
        if(!flag) return -1;
        publish("Done more work..");
        setProgress(10);
    
        if(!flag) return -1;
        publish("Done more work again..");
        setProgress(30);
    
        // Completed
        publish("Completed..");
        setProgress(100);
        return 1;
    }
    

    【讨论】:

    • 你的意思是我在每个 doInBackground 方法中添加了一些全局变量并在每一步中检查它吗?
    猜你喜欢
    • 2016-05-26
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    相关资源
    最近更新 更多