Java 为什么我的线程没有按预期的方式运行?

Java 为什么我的线程没有按预期的方式运行?,java,multithreading,javafx,Java,Multithreading,Javafx,我正在从文件中读取内容并将其显示到GUI 这是我的档案: Log ; ytr Thread Sleep ; 654 Log ; hgfd Thread Sleep ; 543 Log ; hgfd Thread Sleep ; 7654 Log ; grdr 我选择一个文件,它读取该文件,然后同时更新GUI。所以有一个按钮,让我选择我的文件。上面是我的一个文件的一个示例,我读取了它,如果它的日志是,那么它将向GUI输出任何内容 我正在日志函数中执行多线程处理 以下是我的全部相关代码: impo

我正在从文件中读取内容并将其显示到GUI

这是我的档案:

Log ; ytr
Thread Sleep ; 654
Log ; hgfd
Thread Sleep ; 543
Log ; hgfd
Thread Sleep ; 7654
Log ; grdr
我选择一个文件,它读取该文件,然后同时更新GUI。所以有一个按钮,让我选择我的文件。上面是我的一个文件的一个示例,我读取了它,如果它的日志是,那么它将向GUI输出任何内容

我正在日志函数中执行多线程处理

以下是我的全部相关代码:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

public class HelloWorld extends Application {

    final static TextArea m_text_area = new TextArea();
final static GridPane m_grid = new GridPane();
final FileChooser fileChooser = new FileChooser();
static String parameters = "";
final static Scene m_scene = new Scene(m_grid, 500, 500);

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

@Override
public void start(Stage primaryStage) {
    primaryStage.setTitle("Hello World!");
    Button btn = new Button();
    btn.setText("Choose your file...");

    m_grid.add(m_text_area, 0, 1);
    m_grid.add(btn, 0, 0);

    final String thread_sleep = "Thread Sleep";
    final String log = "Log";

    btn.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {

            List<File> list = fileChooser
                    .showOpenMultipleDialog(primaryStage);
            if (list != null) {
                for (File file : list) {

                    if (file.isFile()) {

                        if (file.getName().indexOf(".") != 0) {

                            BufferedReader br = null;

                            try {

                                String sCurrentLine;

                                br = new BufferedReader(new FileReader(file
                                        .getAbsolutePath().toString()));

                                int i = 0;
                                while ((sCurrentLine = br.readLine()) != null) {

                                    if (!sCurrentLine.startsWith("#")) {

                                        String line[] = sCurrentLine
                                                .split(";");

                                        String command = line[0].trim();

                                        try {
                                            parameters = line[1].trim();
                                        } catch (Exception e5) {

                                        }

                                        switch (command) {

                                        case thread_sleep: {

                                                Thread.sleep(Integer
                                                        .parseInt(parameters));
                                            break;
                                        }

                                        case log: {

                                            log(parameters);
                                            break;
                                        }

                                        }

                                    }

                                }

                            } catch (IOException e1) {
                                e1.printStackTrace();
                            } finally {
                                try {
                                    if (br != null)
                                        br.close();
                                } catch (IOException ex) {
                                    ex.printStackTrace();
                                }
                            }

                        }
                    }

                }
            }
        }
    });

    primaryStage.setScene(m_scene);
    primaryStage.show();
}

public static void log(String text) {

    final String textToDisplay = text;
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            m_text_area.appendText(textToDisplay + "\n");

        }
    });

    }
}
我的问题:GUI只冻结和更新一个事件,整个程序已经执行

您正在事件中睡觉。在当前事件完成之前,GUI无法处理更多事件。这就是程序冻结的原因

您需要为此使用后台工作线程。有一个教程


向我们展示整个代码。无法调试任何东西,因为这里没有足够的代码来确定发生了什么。你能用一个较小的例子重现这个问题吗?你忘记了第一个case语句中的中断,所以它继续第二个case,它试图解析Thread.sleepInteger.parseIntsplit[1]中的一个非整数;对不起,那是个错误。我会很快给出相关代码。我看不到任何多线程。所以很明显,您的单个线程不能同时完成两件事:处理您的文件和更新您的UI。
Task<Void> task = new Task<Void>() {
    @Override
    protected Void call() {
        // long-running task
        return (Void)null;
   }
};

new Thread(task).start();