gpt4 book ai didi

java - 如何在能够暂停/恢复的同时以固定间隔从线程获取字符串值?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:32:09 26 4
gpt4 key购买 nike

我制作了一个小型 swing 应用程序供我个人使用。这个应用程序连接到互联网,检索文本文件,在 jTextArea 中显示其内容并将文本文件保存在本地(在我的硬盘中)。到目前为止,一切都很好。

现在我想在固定的固定时间间隔内(比如每 30 秒后)接收此文本文件。我可以通过 for/while 循环(和 thread.sleep 方法)来做到这一点,但我知道这不是正确的方法,因为它不允许我暂停/恢复接收。我曾尝试使用“线程”和“可调用”来解决我的问题,但未能成功。 (我对这些了解不多)

你能指导我如何从线程中收集字符串值吗?我使用 Callable/Future 做了正确的事吗? (请参阅我的代码)。我应该能够暂停/恢复文本收集。

(在暂停和恢复我的软件期间,我将进行一些手动文本编辑并将其保存到磁盘。但我可以处理。)

下面是我试过的代码。

public class AmybactUI extends javax.swing.JFrame {

public AmybactUI() {
initComponents();
}
private void initComponents() { .... }

public static void main(String args[]) throws Exception {

// (Look and feel setting code here)

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {
new AmybactUI().setVisible(true);
}
});

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
List<Future<String>> results = executor.invokeAll(Arrays.asList(new GetScore()), 30, TimeUnit.SECONDS);
for (Future<String> result : results) {
if (!result.isCancelled()) {
jTextAreaOnlineScore.append(result.get()+"\n");
jTextAreaOnlineScore.setCaretPosition(jTextAreaOnlineScore.getDocument().getLength());
} else {
System.out.println("Task timed out.");
}
executor.shutdown();
}
}

// Variables declaration - do not modify
private javax.swing.ButtonGroup buttonGroup1;
private javax.swing.JButton jButtonSaveSMS;
private javax.swing.JLabel jLabelTitle;
private javax.swing.JMenuBar jMenuBar;
private javax.swing.JMenu jMenuFile;
private javax.swing.JMenu jMenuHelp;
private javax.swing.JMenuItem jMenuItemAbout;
private javax.swing.JMenuItem jMenuItemExit;
private javax.swing.JMenuItem jMenuItemOptions;
private javax.swing.JMenu jMenuTools;
private javax.swing.JPanel jPanel;
private static javax.swing.JRadioButton jRadioButtonOffline;
public static javax.swing.JRadioButton jRadioButtonOnline;
private javax.swing.JScrollPane jScrollPane;
public static javax.swing.JTextArea jTextAreaOnlineScore;
private javax.swing.JTextField jTextFieldCustomSMS;
// End of variables declaration
}

class GetScore implements Callable<String> {
public String call() throws Exception {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String nextLine;
String myString = "";
String myTryString;
URL url;
URLConnection urlConn;
InputStreamReader inStream;
BufferedReader buff;
FileWriter fustream;
BufferedWriter bfout;
try {
// (some code here which connects to internet and gets my text)
} else {
break;
}
}
bfout.write(myString);
bfout.close();
} catch(MalformedURLException e) {
System.out.println("Please check the URL:" + e.toString());
} catch(IOException e1) {
System.out.println("Can't read from the Internet: " + e1.toString());
}
Thread.sleep(4000);
return (""+sdf.format(cal.getTime())+myString);
}
}

最佳答案

实际上,您不需要为了获得结果而使用 Futures。执行以下操作:

  • 将 GetScore 设置为可运行
  • 将 TextArea 传递给 GetScore 的构造函数
  • 当 GetScore.run 方法执行时,不要使用 textArea.setText 方法,或使用 SwingUtilities.invokeLater

喜欢:

 SwingUtilities.invokeLater(new Runnable() {
public void run() {
textArea.setText(text);
}
);

关于java - 如何在能够暂停/恢复的同时以固定间隔从线程获取字符串值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12555472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com