2014-08-30 48 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方法)。這意味着工作人員正在孤立運行,而沒有其他數據變化的風險,這可能導致其他隨機問題。