为什么我的Swing工作线程中断工作?

时间:2015-10-04 19:25:05

标签: java multithreading swing backgroundworker interrupt

我有一个小型的java程序,使用WindowBuilder在Eclipse中编写,该程序用于从UTF-8文本文件中读取数据并将其写入数据库。为了保持GUI的响应能力,我使用了一个swing工作线程,在单击按钮时执行。

btnex.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
worker = new SwingWorker<Void, Void>() {
    public Void doInBackground() {
        String[] content = Reader.getContent(file);
        //do something with the content, if something goes wrong, set error to true.
    return null;
}
public void done() {
    if (!error) {
        //handle error
    }
};
worker.execute();

类Reader中的函数getContent将文件中的数据提取到字符串数组中。

public static String[] getContent (String dbfile) {
    try {
        String[] lines = null;
        String[] linesplit = null;
        String store = "";
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(dbfile), "UTF8"));
        String line = "";
        line = reader.readLine();
        linesplit = line.split(";");
        while (linesplit.length > 1 && !line.equals(null)) {
            for (int i = 0; i < linesplit.size(); i++) {
            store += StringFormer.decrypt(linesplit[i]) + " ";
            } //StringFormer is another class written by me, just for decrypting the string
            store += "\n";
            line = reader.readLine();
            if (line.equals(null)) break;
            linesplit = line.split(";");
        }
        reader.close();
        lines = store.split("\n");
        return lines;
    } catch (Exception ex) { //...
    }
}

当我尝试运行程序并单击按钮时,程序无法正常运行。所以我在调试模式下运行程序,因此,thead没有完成,但在完成所有工作之前以某种方式退出。这在getContent中发生,在离开while循环之后但在处理reader.close()之前。在离开while循环之前,调试视图中的调用堆栈包含按钮单击和getContent的调用,旁边是其他调用,但是一旦我离开循环,上面提到的两个被删除,下一个顶层堆栈成员命名为base swing worker class:SwingWorker $ 2(FutureTask).run。

有谁知道,为什么程序没有完成书面工作流程?我在程序中使用多个线程,但是从来没有两个后台线程同时运行。

1 个答案:

答案 0 :(得分:0)

我自己找到了答案: 行if(line.equals(null)抛出NullPointerException。当没有更多内容可以从文件中读出时,line为null,但是函数equals需要定义比较变量。由于line为null,equals抛出异常而没有我注意到它。该行必须是if(line == null)。