1

私のプロジェクトはJavaスイングで実行され、カウント用の2つのボタン(開始/停止)があります。

スタートボタンをクリックしたとき。実行中のスレッド (Thread-0) が 1 つあり、停止ボタンをクリックすると「Thread-0」が消えますが、開始ボタンを何度もクリックすると消えます。Thread-5、Thread-6、... Thread-10 などの多くのスレッドが実行されています。

問題 : [開始] をクリックしてカウントを停止しても問題ありません。しかし、開始を何度もクリックすると、カウントが正しくありません。

スタートボタン

private void btnStartActionPerformed(java.awt.event.ActionEvent evt) {         
    start();
    btnStart.setEnabled(false);
    btnStop.setEnabled(true);
}   

停止ボタン

private void btnStopActionPerformed(java.awt.event.ActionEvent evt) {            
    isEnable = false;
    btnStop.setEnabled(false);
    btnStart.setEnabled(true);
}    

start() メソッド:

isEnable = true;
Thread refreshPlan = new Thread() {  
    @Override
    public void run() {
        while(isEnable) {
            try {
                sleep(CYCLE_TIME * 1000);
                PLAN += 1;
                planValue.setText(String.valueOf(PLAN));
            } catch (InterruptedException ex) {
                //ignore
            }
        }
    };
    };
    refreshPlan.start();

スタートボタンを何度もクリックしたときにシングルスレッドだけを実行できますか? なにか提案を?ありがとう。

私の悪い英語でごめんなさい。

4

2 に答える 2

5

ここには4つの重要な問題があります。

  • 揮発性変数として宣言されていない限りisEnable、あるスレッドからの書き込みが別のスレッドで見られるという保証はありません。
  • 同様に、PLANカウンターへのアクセス(名前が間違っています。Javaの命名規則に従ってください)は安全ではありません。これに使用することを検討することをお勧めしAtomicIntegerます。
  • 追加のスレッドからUIに変更を加えています。それはできません。Swing(およびほとんどのUI)では、UIコンポーネントへのすべてのアクセスは、そのUIを担当するスレッドで行う必要があります。詳細については、Swing同時実行チュートリアルを参照してください。
  • 1秒に1つしかチェックしないためisEnabled、その間に複数のスレッドを停止および開始することが可能になります...一度に複数のスレッドがアクティブになります。これはあなたのカウントを妨げる可能性があります。

javax.swing.Timer1秒に1回起動し、何かを実行するためのものかどうかを確認するだけのaを使用する方がよい場合があります。そうすれば、すべてをUIスレッドに置くことができます。

于 2013-03-15T06:58:12.210 に答える
-1

start メソッドは new Thread() をインスタンス化しているため、クリックするたびに新しいスレッドが生まれます。

Thread refreshPlanクラス変数を宣言し、開始メソッドですべてのコードをこのチェックに入れます

if(refreshPlan == null || !refreshPlan.isAlive()){
//ur existing code to instantiate new thread.
}
于 2013-03-15T06:58:02.517 に答える