【问题标题】:Why isn't my thread running the way it is supposed to?为什么我的线程没有按应有的方式运行?
【发布时间】:2014-11-17 15:24:34
【问题描述】:

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

这是我的文件:

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

我选择了一个文件,它会读取该文件,然后同时更新 GUI。所以有一个按钮可以让我选择我的文件。以上是我的一个文件的示例,我读过它,如果它的“日志”是输出到 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 冻结并仅更新整个程序已执行的一个

【问题讨论】:

  • 向我们展示整个代码。不能用那个调试任何东西
  • 这里没有足够的代码来确定发生了什么。你能用更小的MCVE 重现这个问题吗?
  • 您忘记了第一个 case 语句中的中断,因此它继续尝试解析 Thread.sleep(Integer.parseInt(split[1])); 中的非整数的第二种情况。
  • 对不起,这是一个错误。生病只是快速给出相关代码。
  • 我没有看到任何多线程。所以很明显,你的单线程不能同时做两件事,处理你的文件和更新你的 UI。

标签: java multithreading javafx


【解决方案1】:

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

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

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

new Thread(task).start();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多