我正在尝试实现一个在线订购系统,它可以通过 Java 中的 MySQL 运行。 我正在尝试使用 MVC 实现一个循环类,该类将不断检查数据库表中的更改,该表将在订单到达时保留顺序。现在,对于我收到的每个订单,我都想将其作为“框”显示给 JFrame。
为此,我使用了一个循环调用 OrderCheck.java 类的 Callable 线程。然后从如下所示的 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 以便我可以将它显示在我的图形用户界面。
感谢任何帮助!
如果我的实现有问题,我可以完全理解,并且会接受任何帮助来修复实现。我现在可以看出,问题还在于如何在不停止整个程序的情况下不断地将数据从 Controller 移动到 View 。
问候
编辑:添加这个是因为我觉得需要对这个问题进行一些澄清。 我正在使用 MVC 模式,这意味着我有 3 种不同的抽象,M 代表模型抽象,它包含与应用程序相关的所有单独类,V 代 TableView 抽象,它只会包含用户需要的代码可以看到和调用来自用户的交互。 C 代表 Controller 抽象,它从 View 的用户交互中获取调用,并将它们进一步分发到 Model 中的正确类。
现在,在我的例子中,我有一个在 View 抽象中的 EDT 中创建的 GUI,上面的 SQL-Conituous-loop-feth-connection-class-thing 在模型中(当然)。我想要一种方法让这个线程以某种方式继续循环,同时不断地从 SQL 数据库中获取包含所有相关订单的 ArrayList,然后将它们发送回 Controller 或! (如果可能的话,这听起来更好),直接从循环线程刷新 View 抽象中的主 GUI。
简单来说: - 我如何实现一个循环线程来更新 View 中存在的 GUI,以便在主框架中显示相关的新订单。
下面是我创建 GUI 的方式和位置,以及我如何调用 Controller 来启动线程:
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
}
以下代码是我如何从 Controller 调用 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;
}
最佳答案
请勿返回。您已经知道如何创建线程池并在其中执行线程,因此每次数据库查询返回订单时,只需创建一个异步线程来执行该订单。并且仅在程序关闭时退出无限循环。
关于java - 从循环线程返回多个值而不用Java杀死它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29472996/