我可能在這裏錯過了一些東西,但我會嘗試解釋我想實現的目標,然後有人請告訴我我做錯了(我是:))並指出我在正確的方向?在Java FX UI中使用應該返回結果的線程
我正在使用JavaFX 2.0,但我認爲這個問題可能適用於Swing或任何UI框架。
我想爲我的應用程序開發一個簡單的啓動畫面,當啓動畫面啓動時,我想要有一個消息標籤,用於更新用戶發生的事情,關於配置後端應用程序。我的應用程序啓動有2個步驟,第一步使用Spring初始化應用程序上下文,該應用程序上下文又初始化數據庫(JPA 2.0/Hibernate/etc)。我的應用程序啓動過程的第二部分將查詢數據庫以獲取將用於填充UI的初始數據。在關閉啓動畫面之前,這兩個步驟都需要完成,並且在每一步之間我都要更新啓動畫面中的標籤,讓用戶知道當時正在執行哪個階段。
我已經把它分解成下面這個簡單的程序,它使用JavaFX和一個按鈕,當按鈕被按下時,一個新的線程被創建,啓動另一個類,它只是執行一些伯爵值,然後另一個創建另一個線程來模擬啓動過程的第二步,但我的問題是第二個線程在第一個線程完成之前嘗試運行,並因此導致NPE運行。
下面是一些簡單的代碼,突出這一問題故障:
public class Test extends Application
{
private LongTester lt;
public static void main(String[] args)
{
launch(args);
}
@Override
public void start(Stage primaryStage)
{
Button btn = new Button();
final Label lblText = new Label("Starting");
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent event)
{
new Thread(new ConstructorRunnable()).start();
lblText.setText("More Loading?");
new Thread(new MethodRunnable()).start();
lblText.setText("Finished");
}
});
HBox root = new HBox();
root.getChildren().add(btn);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
private class ConstructorRunnable implements Runnable
{
@Override
public void run()
{
lt = new LongTester();
}
}
private class MethodRunnable implements Runnable
{
@Override
public void run()
{
lt.countAgain();
}
}
private class LongTester
{
public LongTester()
{
for (int idx = 0; idx < 1000000; idx++)
{
System.out.println("Constructor: " + idx);
}
}
public Boolean countAgain()
{
for (int idx = 0; idx < 1000000; idx++)
{
System.out.println("Method: " + idx);
}
return Boolean.TRUE;
}
}
}
任何人都可以指出我的錯誤?
乾杯@jewelsea我調查之前使用的任務,但再次我的問題是,當只需要1使用2線程,你指出這一點,以及我接受你的答案,由於JavaFX代碼。再次感謝。 – 2012-07-12 20:15:32