有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从MySQL多线程Java获取响应

比方说,我有一个大的、耗时的处理任务,通常需要查询MySQL数据库。我希望主线程在等待SQL server响应时保持处理,因此我在另一个线程中进行查询

如果查询在另一个线程中,我将如何从查询中获取响应数据?我可能会将结果保存在数组或队列中,但我不确定在单独的线程(使用连接池)中处理MySQL查询的最佳实践是什么

谢谢


共 (2) 个答案

  1. # 1 楼答案

    一种方法是让创建线程的类将“this”传递给运行线程的类的构造函数,当线程完成获取结果时,它可以调用第一个类上的公共方法将结果传递回。如果这还不够合理,我可以提供代码片段

  2. # 2 楼答案

    您可以使用另一个线程(或runnable)来获取查询结果,但要确保查询任务是自包含的:它打开一个连接(或从连接池中获取一个连接),启动查询,获取结果,将结果存储在某个变量(例如HashMap)中,关闭查询,结果集和连接(或将其返回到池)。当所有这些都完成后(使用适当的try-catch-finally块),任务就可以将数据“发送”到主处理线程

    使用TeresaCarrigan在answer中描述的方法,下面是一个“工作线程”如何将数据“发送”到“主线程”的示例:

    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    import java.util.Random;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
    
    public class Q21176667 implements Runnable {
    
        private static volatile boolean stop;
    
        public static void main(String... args) {
    
            Thread t = new Thread(new Q21176667());
            t.start();
            sleep(200);
            stop = true;
        }
    
        private BlockingQueue<Long> q = new ArrayBlockingQueue<Long>(100); 
    
        @Override
        public void run() {
    
            try {
                while (!stop) {
                    if (q.peek() == null) {
                        new Thread(new GetUpdates(this)).start();
                    }
                    long l = q.take();
                    System.out.println("Main sleep: " + l);
                    sleep(l);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public void add(Collection<Long> moreData) {
    
            for (Long l : moreData) {
                q.add(l);
            }
        }
    
        static class GetUpdates implements Runnable {
    
            final Q21176667 processor;
    
            public GetUpdates(Q21176667 processor) {
                this.processor = processor;
            }
    
            @Override
            public void run() {
    
                List<Long> vlist = new ArrayList<Long>();
                // Run query, process results
                sleep(10);
                Random r = new Random();
                for (int i = 0; i < 3; i++) {
                    vlist.add(new Long(r.nextInt(10)));
                }
                System.out.println("Adding " + vlist.size() + " more sleeps.");
                processor.add(vlist);
            }
        }
    
        public static void sleep(long timeMs) { 
            try { Thread.sleep(timeMs); } catch (Exception ignored) {}
        }
    
    }
    

    输出如下所示:

    Adding 3 more sleeps.
    Main sleep: 5
    Main sleep: 9
    Main sleep: 0
    Adding 3 more sleeps.
    Main sleep: 3
    Main sleep: 7
    Main sleep: 8
    etc.