java中的多线程最佳实践

时间:2012-12-27 16:59:05

标签: java multithreading

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

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

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

现在我在同一个类中添加另一个函数func_3,它调用这两个函数,但也确保它们并行执行。为此,我正在使用callables和期货。这是以正确的方式使用它吗?我将此变量存储在临时变量中,然后使用它来调用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
    }
}

2 个答案:

答案 0 :(得分:5)

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

其次,是的,这是常见的做法。此外,如果你打算经常调用func_3 - 避免创建固定的线程池,你应该将它作为params传递,因为线程创建相当“昂贵”。

答案 1 :(得分:0)

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