为什么我的线程不按照预期的方式运行?

时间:2014-11-17 15:24:35

标签: java multithreading javafx

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

这是我的档案:

Log ; ytr
Thread Sleep ; 654
Log ; hgfd
Thread Sleep ; 543
Log ; hgfd
Thread Sleep ; 7654
Log ; grdr

我选择一个文件然后读取文件,然后同时更新GUI。所以有一个按钮让我选择我的文件。以上是我的一个文件的样本,我读了它,如果它的" Log"输出任何它到GUI。

我正在log函数

进行多线程处理

这里更新我的完整(相关)代码:

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冻结并仅更新整个程序已执行的一个

1 个答案:

答案 0 :(得分:0)

sleep在活动中。在当前事件结束之前,GUI无法处理其他事件。这就是程序冻结的原因。

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

Task<Void> task = new Task<Void>() {
    @Override
    protected Void call() {
        // long-running task
        return (Void)null;
   }
};

new Thread(task).start();