我对在循环中使用线程进行了一些广泛的搜索,虽然我了解单独线程如何工作的概念,但我似乎仍然无法掌握如何在我的简单应用程序中实现它。
我的申请由一个带有文本框的表单组成。每次循环迭代时都需要更新此文本框。它以按下按钮开始,但循环也应以按下停止按钮结束。我使用了一个布尔值来跟踪它是否被按下。
这是我的表单代码:
package threadtester;
public class MainForm extends javax.swing.JFrame {
public MainForm() {
initComponents();
}
private void RunButtonActionPerformed(java.awt.event.ActionEvent evt) {
ThreadTester.setRunnable(true);
ThreadTester example = new ThreadTester(2,this);
example.run();
}
private void StopButtonActionPerformed(java.awt.event.ActionEvent evt) {
ThreadTester.setRunnable(false);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainForm().setVisible(true);
}
});
}
public void setTextBox(String myString){
MainTextbox.setText(myString);
}
}
正如你所看到的,我有一个被按下的按钮。当按下按钮时,将执行名为 ThreadTester 的不同类中的代码。这是该类的代码:
package threadtester;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ThreadTester implements Runnable
{
int thisThread;
MainForm myMainForm;
private static boolean runnable;
// constructor
public ThreadTester (int number,MainForm mainForm)
{
thisThread = number;
myMainForm = mainForm;
}
public void run ()
{
for (int i =0;i< 20; i++) {
if(runnable==false){
break;
}
System.out.println("I'm in thread " + thisThread + " line " + i);
myMainForm.setTextBox(i + "counter");
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(ThreadTester.class.getName()).log(Level.SEVERE, null, ex);
}
} }
public static void setRunnable(Boolean myValue){
runnable = myValue;
}
public static void main(String[] args) {
MainForm.main(args);
}
}
正如您所看到的,循环是在单独的线程上创建的...但文本框仅在循环完成后更新。现在据我所知,在我的 MainForm 中,我创建了一个单独的线程来运行循环,所以我不明白为什么它不运行?任何指导将不胜感激,我尝试查看堆栈交换的示例,但我似乎无法让它们适合我的实现。
根据 Tassos 的建议,我的运行方法现在如下所示:
public void run ()
{
for (int i =0;i< 20; i++) {
if(runnable==false){
break;
}
System.out.println("I'm in thread " + thisThread + " line " + i);
final String var = i + "counter";
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
myMainForm.setTextBox(var);
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(ThreadTester.class.getName()).log(Level.SEVERE, null, ex);
}
} }