【发布时间】:2015-06-10 22:51:27
【问题描述】:
我正在尝试实现一个在线订购系统-isch 的东西,它将通过 Java 中的 MySQL 工作。 使用 MVC,我正在尝试实现一个循环类,该类将不断检查数据库表中的更改,这些更改将在订单到达时保存。现在,对于我收到的每个订单,我都想将其作为“盒子”显示到 JFrame 中。
为此,我使用了一个可调用线程,该线程循环名为 OrderCheck.java 的类。然后从 Controller 调用此函数,如下所示。
public ArrayList<Order> StartOrderChecking() {
OrderCheck OCObj = new OrderCheck();
service = Executors.newFixedThreadPool(1); //We want one thread
task = service.submit(OCObj); //Submit the thread
try {
orderList = task.get();
} catch (final InterruptedException ex) {
ex.printStackTrace();
} catch (final ExecutionException ex) {
ex.printStackTrace();
}
return orderList;
}
而且线程函数看起来有点像这样……
public ArrayList<Order> call() {
try {
while (true) {
System.err.println("Thread looping");
ConnectToDB();
query = "SELECT * FROM mb_orders";
stmt = con.createStatement();
rs = stmt.executeQuery(query);
orderList = new ArrayList<Order>();
while (rs.next()) {
int ID = rs.getInt("ID");
String email = rs.getString("email");
String order = rs.getString("order");
String orderinfo = rs.getString("orderinfo");
int phone = rs.getInt("phone");
newOrder = new Order(ID,email,order,orderinfo,phone); //We create and Order object
orderList.add(newOrder); // This is my Arraylist that i want to return back to the view
return orderList;
}
stmt.close();
con.close();
Thread.sleep(Time);
}
} catch (Exception e) {
}
return null;
}
代码简单地循环直到程序终止,每 3 秒我检查一次数据库是否有新订单到达,如果有,则将它们存储在 ArrayList 中,然后返回。 现在我面临的问题是这个实现只会返回一次然后线程就会死掉,我想以某种方式从数据库中获取连续的数据更新到控制器,然后将它发送回视图,以便我可以显示它我的图形用户界面。
感谢任何帮助!
我可以完全理解我的实施是否有问题,并且会接受任何帮助来修复实施。我现在可以看到,问题还在于如何在不停止整个程序的情况下不断地将数据从 Controller 移动到 view。
问候
编辑:添加这个是因为我觉得需要对这个问题进行一些澄清。 我使用的是 MVC 模式,这意味着我有 3 个不同的抽象,M 代表模型抽象,它包含与应用程序相关的所有单独的类,V 代表视图抽象,它只会包含用户的代码可以从用户交互中看到和调用。 C 代表控制器抽象,它从视图中获取来自用户交互的调用,并进一步将它们分发到模型中的正确类。
现在,在我的情况下,我有一个在视图抽象中的 EDT 中创建的 GUI,并且上面的 SQL-Conituous-loop-feth-connection-class-thing 在模型中(当然)。我希望这个线程以某种方式继续循环,同时不断地从 SQL 数据库中获取包含所有相关命令的 ArrayList,然后将它们发送回控制器 OR! (如果可能的话,这听起来更好),直接从循环线程刷新视图抽象中的主 GUI。
所以简单地说: - 我如何实现一个循环线程来更新视图中存在的我的 GUI,以便在主框架中显示相关的新订单。
以下是我创建 GUI 的方式和位置,以及我如何调用控制器来启动线程:
public class View extends JFrame {
.
.
.
public View(String UN) {
setTitle("ExpressFood Admin Panel: " + UN);
setSize(800, 800);
setLocationRelativeTo(null); //Centered JFrame...
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Panel Setup
JPanel mainPanel = new JPanel();
add(mainPanel);
mainPanel.setLayout(null);
JMenuBar mainMenu = new JMenuBar();
//Build test menu if needed...
JMenu menu = new JMenu("A Menu");
mainMenu.add(menu);
setJMenuBar(mainMenu);
}
.
.
private void StartSim() throws SQLException, Exception {
//Show the main frame to the user
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame mainFrame = new View(UN);
mainFrame.setVisible(true);
}
});
orderList = controller.StartOrderChecking(); //Call to Controller for OrderCheck.java
}
以下代码是我如何从控制器调用 OrderCheck.java 类:
public ArrayList<Order> StartOrderChecking() {
OrderCheck OCObj = new OrderCheck();
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleWithFixedDelay(OCObj, 1, 3, TimeUnit.SECONDS);
orderList = OCObj.sendToEDTForUpdate();
return orderList;
}
【问题讨论】:
-
哪里有抛出异常?异常将导致线程死亡。唯一可能的问题可能是数据库连接未释放或重新建立。
-
不抛出异常,程序在其状态下工作,但是每当添加/删除数据库条目时持续更新是程序无法做到的事情
-
注意线程正在返回,这会破坏while循环。
-
起初我打算发表一个关于自己工作的尖刻评论,然后我意识到你大部分时间都这样做了,你需要帮助来解决一个特定的、可重现的问题,其原因你甚至知道并且解释,并提供相关代码。好问题。欢迎来到本站!
-
非常感谢!总的来说,我对编程很陌生,问题尚未解决,但我得到了一些非常有价值的帮助!
标签: java mysql multithreading