java.lang.OutOfMemoryError无法创建新的本机线程

时间:2014-04-05 12:12:50

标签: java swing timer jtable global-variables

(在NetBeans / Java中工作)我使用一个按钮从外部源检索值,一切都运行良好,但有一些小问题,然后我开始遇到java.lang.OutOfMemoryError: unable to create new native thread异常

此应用程序将外部值写入JTable。此外部值是其他位置的公共变量

我知道使用多个JFrame是不好的做法,但我没有看到重新创建一个全新的Java Card或Option Pane / Dialog的重点。我还决定创建一个解决方案来使事情发挥作用。

可能导致它的原因以及如何解决?

这是代码。例外情况指向Timer timer = new Timer();

String username;
String password;

//...

final Apps.UserManager.NewUser newUser = new Apps.UserManager.NewUser();
newUser.setVisible(true);
newUser.requestFocus();

newUser.suVftrun = 0;

int delay = 10000; // delay for 10 sec.
int period = 1000; // repeat every sec.

do{
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
            DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
            int bcol1 = model.getColumnCount();
            int bcol2 = model.getRowCount();

            username = newUser.u2ftrun;
            password = newUser.p2ftrun;

            System.out.println(newUser.u2ftrun);
            System.out.println(newUser.p2ftrun);

            try {
                String tRecord1 = (String) jTable1.getValueAt(bcol1, bcol2);
                if (newUser.suVftrun == 1) {
                    if (!username.equals(null)) {
                        if (!tRecord1.equals(username)) {
                            model.addRow(new Object[]{username, password});
                            this.cancel();
                        } else {
                            System.out.println("Same Data");
                        }
                    } else {
                        System.out.println("No Data Received!");
                    }
                } else {
                    System.out.println("User hasn't been created yet");
                }
            } catch (Exception ex) {
                System.out.println("No values in table. Trying alternative");
                try {
                    if (newUser.suVftrun == 1) {
                        if (!username.equals(null)) {
                            try {
                                model.addRow(new Object[]{username, password});
                                this.cancel();
                            } catch (Exception e) {
                                System.out.println("Repeating...");
                            }
                        } else {
                            System.out.println("No Data Received!");
                        }
                    } else {
                        System.out.println("User hasn't been created yet");
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }, delay, period);
} while (newUser.isVisible());

1 个答案:

答案 0 :(得分:4)

您有大量问题。等等,这还不够大:

一个大问题

更好。

您正忙着在do循环中等待,并且每次都开始新的Timer

do {
    Timer timer = new Timer();
    //some other stuff
} while (newUser.isVisible());

这会导致数千(数百万?)个Timer个实例被创建,每个实例都有自己的Thread

  1. 从不忙等待
  2. 不要创建数以千计的Timer个实例
  3. 此外,您使用的是java.util.Timer而不是javax.swing.Timer,这意味着最终操作未在EDT上执行。

    如果使用Swing线程策略,这是违规行为。 Swing对象({3}}除外)非线程安全只能从EDT 访问。

    总之;这段代码不是错误的。