23

Start と Stop という 2 つのボタンを備えた単純な JavaFX 2 アプリがあります。開始ボタンがクリックされたときに、何らかの処理を行い、UI (進行状況バーなど) を更新するバックグラウンド スレッドを作成したいと考えています。停止ボタンがクリックされたら、スレッドを終了させたい。

ドキュメントから収集したクラスを使用してこれを実行しようとしましたが、これjavafx.concurrent.Taskはうまく機能します。しかし、[開始] をクリックするたびに、UI が通常の状態ではなくフリーズ/ハングします。

彼女はMyprogram extends Application、ボタンを表示するためのメイン クラスのコードです。

public void start(Stage primaryStage)
{               
    final Button btn = new Button();
    btn.setText("Begin");

    //This is the thread, extending javafx.concurrent.Task :
    final MyProcessor handler = new MyProcessor();
    btn.setOnAction(new EventHandler<ActionEvent>()
    {
        public void handle(ActionEvent event)
        {                
           handler.run(); 
        }
    });

    Button stop = new Button();
    stop.setText("Stop");
    stop.setOnAction(new EventHandler<ActionEvent>()
        {
             public void handle(ActionEvent event)
             {
                handler.cancel();
             }
        }

    );
    // Code for adding the UI controls to the stage here.
}

MyProcessorクラスのコードは次のとおりです。

import javafx.concurrent.Task;
public class MyProcessor extends Task
{   
    @Override
    protected Integer call()
    {
        int i = 0;
        for (String symbol : feed.getSymbols() )
        {
            if ( isCancelled() )
            {
                Logger.log("Stopping!");
                return i;
            }
            i++;
            Logger.log("Doing # " + i);
            //Processing code here which takes 2-3 seconds per iteration to execute
            Logger.log("# " + i + ", DONE! ");            
        }
        return i;
    }
}

非常に単純ですが、[スタート] ボタンをクリックするたびに UI がハングしますが、コンソール メッセージは引き続き表示されます (Logger.log単純に表示されますSystem.out.println) 。

私は何を間違っていますか?

4

1 に答える 1

25

Taskを実装Runnableしているため、呼び出したhandler.run();ときに実際にcallUI スレッドでメソッドを実行します。それはUIをハングさせます。

Executor を介して、または単に を呼び出して、バックグラウンド スレッドでタスクを開始する必要がありますnew Thread(handler).start();

これは、javadocまたはJavaFX 同時実行チュートリアルで説明されています (あまり明確ではないかもしれません) 。

于 2013-02-03T16:46:03.720 に答える