java - 从循环线程返回多个值而不用Java杀死它

标签 java mysql multithreading

我正在尝试实现一个在线订购系统,它可以通过 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/

相关文章:

C# 多线程应用程序和 SQL 连接帮助

java - Java中的属性是什么?

java - 模拟器 Oreo 和真实设备上的 INSTALL_FAILED_NO_MATCHING_ABIS

java - 无法下载网页内容

c# - C#中的同步任务队列

Java多线程仅用于2台计算机,如何在main中执行

java - Vaadin 中的外部项目依赖项

python - 确认浏览器预取导致删除

mysql - MySQL自动导入的错误日志?

java - 创建新数据库连接时 Eclipse 不显示 MySQL 驱动程序