2014-08-30 77 views
3

所以我刚刚进入秋千工人,我不知道如何阻止它我试图这boolean方式。它不工作,你可以编辑我的代码的方式,它会工作或什么的!非常感谢!SwingWorker不停止

没有错误显示它只是不停止!

class MessageBox { 

    public static void infoBox(String infoMessage, String location) 
    { 
     JOptionPane.showMessageDialog(null, infoMessage, "Message: " + location, JOptionPane.INFORMATION_MESSAGE); 
    } 
} 

public class GUI extends JFrame 
{ 
    private JButton button1; 
    private JPanel Gpanel; 
    private JTextField textField1; 
    private JTextField howmany; 
    private JLabel countlabel; 
    private JLabel statuslabel; 
    private JCheckBox anyEmail; 
    private JButton stopButton; 
    private boolean stopped; 


    public GUI() { 
     super("Program V0.1"); 
     this.setIconImage(new ImageIcon(getClass().getResource("icon.png")).getImage()); 

     setContentPane(Gpanel); 
     pack(); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     setVisible(true); 

     button1.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       start(); 
      } 
     }); 
     stopButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
      stopped = true; 
      } 
     }); 
    } 

    private void start() { 
     SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() { 

      @Override 
      protected Void doInBackground() throws Exception { 
       if (!stopped){ 
        for (int i = 0; i < Integer.parseInt(howmany.getText()); i++) { 
         if (anyEmail.isSelected()) { 

          URL url = null; 
          try { 
           String Hostemail = "http://example.com/"; 
           url = new URL(Hostemail); 
          } catch (MalformedURLException e) { 
           e.printStackTrace(); 
          } 
          Map<String, Object> variables = new LinkedHashMap<>(); 

          variables.put("email", textField1.getText()); 
          variables.put("fullname", ""); 
          variables.put("pw", ""); 
          variables.put("pw-conf", ""); 
          variables.put("digest", "1"); 
          variables.put("email-button", "Subscribe"); 

          StringBuilder postData = new StringBuilder(); 
          for (Map.Entry<String, Object> param : variables.entrySet()) { 
           if (postData.length() != 0) { 
            postData.append('&'); 
           } 
           try { 
            postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); 
           } catch (UnsupportedEncodingException e) { 
            e.printStackTrace(); 
           } 
           postData.append('='); 
           try { 
            postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8")); 
           } catch (UnsupportedEncodingException e) { 
            e.printStackTrace(); 
           } 
          } 
          byte[] postDataBytes = new byte[0]; 
          try { 
           postDataBytes = postData.toString().getBytes("UTF-8"); 
          } catch (UnsupportedEncodingException e) { 
           e.printStackTrace(); 
          } 
          String line; 
          HttpURLConnection conn = null; 
          try { 
           assert url != null; 
           conn = (HttpURLConnection) url.openConnection(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          try { 
           assert conn != null; 
           conn.setRequestMethod("POST"); 
          } catch (ProtocolException e) { 
           e.printStackTrace(); 
          } 

          conn.setRequestProperty("Cache-Control", "no-cache,private,Private"); 

          conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
          conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); 
          conn.setDoOutput(true); 
          try { 
           conn.getOutputStream().write(postDataBytes); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 

          BufferedReader in = null; 
          try { 
           in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          try { 
           assert in != null; 
           while ((line = in.readLine()) != null) { 

            String success = "Your subscription request has been received"; 
            if (line.contains(success)) { 
             countlabel.setText(String.valueOf(i)); 
            } 
           } 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
         } else { 
          URL url = null; 
          try { 
           String Host = "http://example2.com"; 
           url = new URL(Host); 
          } catch (MalformedURLException e) { 
           e.printStackTrace(); 
          } 
          Map<String, Object> variables = new LinkedHashMap<>(); 

          variables.put("strEmail", textField1.getText()); 

          StringBuilder postData = new StringBuilder(); 
          for (Map.Entry<String, Object> param : variables.entrySet()) { 
           if (postData.length() != 0) { 
            postData.append('&'); 
           } 
           try { 
            postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); 
           } catch (UnsupportedEncodingException e) { 
            e.printStackTrace(); 
           } 
           postData.append('='); 
           try { 
            postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8")); 
           } catch (UnsupportedEncodingException e) { 
            e.printStackTrace(); 
           } 
          } 
          byte[] postDataBytes = new byte[0]; 
          try { 
           postDataBytes = postData.toString().getBytes("UTF-8"); 
          } catch (UnsupportedEncodingException e) { 
           e.printStackTrace(); 
          } 
          String line; 
          HttpURLConnection conn = null; 
          try { 
           assert url != null; 
           conn = (HttpURLConnection) url.openConnection(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          try { 
           assert conn != null; 
           conn.setRequestMethod("POST"); 
          } catch (ProtocolException e) { 
           e.printStackTrace(); 
          } 

          conn.setRequestProperty("Cache-Control", "no-cache,private,Private"); 

          conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
          conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); 
          conn.setDoOutput(true); 
          try { 
           conn.getOutputStream().write(postDataBytes); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 

          BufferedReader in = null; 
          try { 
           in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          try { 
           statuslabel.setText("Sending Emails..."); 
           assert in != null; 
           while ((line = in.readLine()) != null) { 

            String success = "success"; 
            String error = "not"; 

            if (line.contains(success)) { 
             countlabel.setText(String.valueOf(i)); 
            } else if (line.contains(error)) { 
             MessageBox.infoBox("[Email Not Found]: " + textField1.getText(), "Error"); 
             break; 
            } 
           } 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
         } 
        } 

       } 
       statuslabel.setText("Done"); 
       return null; 
      } 

     }; 
     worker.execute(); 
     if (stopped){ 
      worker.cancel(true); 
     } 
    } 
} 
+0

你有没有试过呼叫工人的取消? – MadProgrammer 2014-08-30 22:22:31

+0

这就是程序人我不知道如何在动作监听器中调用它:/所以我尝试使用bool – Shrekt 2014-08-30 22:24:31

+0

然后你需要一个引用正在运行的工作者以调用'cancel'改变你的'start'方法,以便它创建一个'SwingWorker'分配给一个类实例变量,而不是一个局部变量。 – MadProgrammer 2014-08-30 22:32:27

回答

1

我认为问题在于,您在通过调用worker.execute()方法启动回转工具后立即检查是否stopped == true。由于​​方法不阻塞,因此在调用​​之后立即对if语句进行评估。此时,停止的值只能是true,因此您的员工不会被取消。一个解决办法是,让你的员工一个实例成员,做更是这样的:

private SwingWorker worker; 
// ... 
stopButton.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (worker != null && !worker.isCanceled()) { 
      worker.cancel(true); 
     } 
    } 
}); 

此外,如果您有访问和更改从不同的线程,你应该同步的访问成员。

0

您需要检查是否stopped是真实的一次每个循环互为作用,没有一次循环之前。您可以将您的工作人员重写为:

@Override 
    protected Void doInBackground() throws Exception { 
     for (int i = 0; i < Integer.parseInt(howmany.getText()); i++) { 
      if(stopped){return null;} 
      //your existing loop contents 
     } 
    } 

只要它尝试执行下一次迭代,就会停止循环。但是,除非您中断线程或以其他方式强制停止线程,否则当前迭代将完成。

另外,您需要确保在已声明的停止位置标记为volatile。

+0

@MadProgrammer OP的源代码中的for循环如何不是一个循环? – hexafraction 2014-08-30 22:21:51

+0

它没有工作的人 – Shrekt 2014-08-30 22:30:16

+0

@ToxicSAS注意,工作人员不会“突然”停止。在有时间评估“停止”状态之前,工作者将继续执行当前循环迭代。你也可以使'stopped'' volatile'或使用['AtomicBoolean'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html)来解决可能的'线程'内存引用问题 – MadProgrammer 2014-08-30 22:35:04

1

你可以采取的SwingWorker小号Future传统优势,并使用isCancelledcancel功能...

protected Void doInBackground() throws Exception { 
    int i = 0; 
    while (!isCancelled() && i < howMany) { 
     ... 

为了能够取消工人,你需要给它的参考...

private SwingWorker worker; 

//... 

stopButton.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (worker != null) { 
      worker.cancel(true); 
     } 
    } 
}); 

注意,SwingWorker不应该被访问或引用任何UI组件(事实上,你应该避免引用它之外的任何值的情况下如果可能),因为...如果它运行在后台,您将冒着(不仅)违反Swing的单线程规则的风险,还会让您在处理它时所依赖的信息发生变化。

在启动它之前,您应该收集所需的所有信息并将其传递给它(通过构造函数或setter方法)。这意味着工作人员正在孤立运行,而没有其他数据变化的风险,这可能导致其他随机问题。