(在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());
答案 0 :(得分:4)
您有大量问题。等等,这还不够大:
更好。
您正忙着在do
循环中等待,并且每次都开始新的Timer
:
do {
Timer timer = new Timer();
//some other stuff
} while (newUser.isVisible());
这会导致数千(数百万?)个Timer
个实例被创建,每个实例都有自己的Thread
。
Timer
个实例此外,您使用的是java.util.Timer
而不是javax.swing.Timer
,这意味着最终操作未在EDT上执行。
如果使用Swing线程策略,这是违规行为。 Swing对象({3}}除外)非线程安全,只能从EDT 访问。
总之;这段代码不是错误的。