6

我是 Java 编程新手。我有一个用例,我必须并行执行 2 个数据库查询。我的班级结构是这样的:

class A {
    public Object func_1() {
        //executes db query1
    }

    public Object func_2() {
        //executes db query1
    }
}

现在我在同一个类中添加了另一个函数 func_3 ,它调用这两个函数,但也确保它们并行执行。为此,我正在使用可调用对象和期货。以这种方式使用它是否正确?我将这个变量存储在一个临时变量中,然后使用它从 func_3 调用 func_1 和 func_2(我不确定这是正确的方法)。或者有没有其他方法可以处理此类案件?

class A {
    public Object func_1() {
        //executes db query1
    }

    public Object func_2() {
        //executes db query1
    }

    public void func_3() {
        final A that = this;
        Callable call1 = new Callable() {
            @Override
            public Object call() {
               return that.func_1();
            }
        }

        Callable call2 = new Callable() {
            @Override
            public Object call() {
               return that.func_2();
            }
        }
        ArrayList<Callable<Object>> list = new ArrayList<Callable<Object>>();
        list.add(call1);
        list.add(call2);
        ExecutorService executor = Executors.newFixedThreadPool(2);
        ArrayList<Future<Object>> futureList = new ArrayList<Future<Object>>();
        futureList = (ArrayList<Future<Object>>) executor.invokeAll(list);
        //process result accordingly
    }
}
4

2 回答 2

5

首先,您不需要将其存储在另一个局部变量中:外部函数将可用,func_1()或者func_2()当您想要获取this外部类时,您只需使用A.this.

其次,是的,这是常见的方法。此外,如果您要经常调用 func_3 - 避免创建固定线程池,则应该将其作为参数传递,因为线程创建相当“昂贵”。

于 2012-12-27T17:10:50.743 回答
0

Executor(Service) 的整个想法是为许多小任务使用少量线程。在这里,您使用 2 线程执行器执行 2 个任务。我要么创建全局定义的执行程序,要么只为 2 个任务生成 2 个线程。

于 2012-12-27T17:53:20.703 回答