我爲我的個人使用製作了一個小型鞦韆應用程序。這個應用程序連接到互聯網,檢索一個文本文件,在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);
}
}
是否正在該代碼或者是你得到了一些錯誤? – Tudor
你應該提供你的工作的[sscce](http://sscce.org),而不是整個代碼。 –
Tudor:代碼正在工作,但是當我嘗試暫停該線程時,我的應用程序掛起。 – mzeeshan