ループ内でのスレッドの使用について広範な検索を行いましたが、個別のスレッドがどのように機能するかという概念は理解していますが、単純なアプリケーションでそれを実装する方法をまだ把握できていないようです。
私のアプリケーションは、テキスト ボックスのあるフォームで構成されています。このテキストボックスは、ループの反復ごとに更新する必要があります。ボタンを押すとループが始まりますが、停止ボタンを押すとループも終了します。ブール値を使用して、押されたかどうかを追跡しました。
ここに私のフォームコードがあります:
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 によって提案された推奨事項により、私の run メソッドは次のようになります。
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);
}
} }