簡體   English   中英

Java FX后台線程使GUI凍結

[英]Java FX background threads make GUI freeze

我試圖了解為什么在后台線程中運行昂貴的操作時Java FX應用程序凍結了。 這是我的課:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class TestApp extends Application {

public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {
    primaryStage.setTitle("Test Threads");
    // create grid for the form
    GridPane grid = new GridPane();
    grid.setAlignment(Pos.TOP_CENTER);
    grid.setHgap(10);
    grid.setVgap(10);
    grid.setPadding(new Insets(25, 25, 25, 25));

    TextField tf = new TextField();
    grid.add(tf, 0, 0);

    Button runButton = new Button("Run");
    grid.add(runButton, 0, 1);
    runButton.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent e) {
            System.out.println(Thread.currentThread() + ": starting threads");
            for (int i=0;i<5;i++){
            Task<Integer> task = new Task<Integer>() {

                @Override
                public Integer call() {
                    Random rand = new Random();
                    List<Integer> numbers = new ArrayList<Integer>();

                    for (int i=0; i<20000000; i++){
                        numbers.add(rand.nextInt());
                    }
                    System.out.println(Thread.currentThread() + ": generated");

                    return numbers.size();
                }
            };
            new Thread(task).start();
            }
            System.out.println(Thread.currentThread() + ": started all threads.");
        }
    });

    StackPane root = new StackPane();
    root.getChildren().add(grid);
    primaryStage.setScene(new Scene(root, 500, 420));
    primaryStage.show();
}

}

當按下“運行”按鈕時,將創建並啟動五個后台線程。 所有線程運行並生成每個具有20000000整數的列表。 即使這些操作在其他線程上運行,GUI仍然凍結,我無法找到問題。

有什么建議么?

您的問題很容易解釋。 CPU真的很努力。

假設您有4個核心和6個線程(UIThread + 5個計算線程)。 6個線程必須共享這4個內核。 因此,即使UIThread也需要等待調度程序給他一些CPU時間,這可能需要隨機的時間。 因此,您的UI可能會凍結隨機的時間長度,或者直到3個計算線程結束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM