2012-12-27 32 views
6

Tôi mới làm quen với lập trình Java. Tôi có một trường hợp sử dụng, nơi tôi phải thực hiện 2 db truy vấn song song. Cấu trúc lớp học của tôi giống như sau:Thực hành tốt nhất đa luồng trong java

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

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

Bây giờ tôi có thêm hàm khác func_3 trong cùng một lớp gọi 2 hàm này nhưng cũng đảm bảo rằng chúng thực thi song song. Vì điều này, tôi đang sử dụng các cuộc gọi và tương lai. Có đúng cách để sử dụng nó theo cách này không? Tôi đang lưu trữ biến này trong một biến tạm thời và sau đó sử dụng biến này để gọi func_1 và func_2 từ func_3 (mà tôi không chắc chắn là cách tiếp cận chính xác). Hay có cách nào khác để xử lý các trường hợp như thế này?

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 
    } 
} 
+1

"Tôi là người mới lập trình Java" = false :) –

+1

Tôi nghĩ điều đó là ổn. Nhưng bạn phải cẩn thận về các thuộc tính được chia sẻ được sử dụng trong 'func_1' và' func_2' đồng thời. –

+4

http://www.javaconcurrencyinpractice.com/? – fge

Trả lời

5

Trước hết, bạn không cần phải lưu trữ này trong một biến cục bộ: các chức năng bên ngoài sẽ có mặt cũng giống như func_1() hoặc func_2() và khi bạn muốn để có được this của lớp bên ngoài bạn chỉ cần sử dụng A.this.

Thứ hai, có, đó là cách phổ biến để thực hiện điều đó. Ngoài ra, nếu bạn định gọi func_3 thường xuyên - tránh tạo hồ bơi cố định, bạn chỉ cần chuyển nó thành tham số, vì việc tạo luồng thay vì 'tốn kém'.

0

Toàn bộ ý tưởng của Executor (Service) là sử dụng số lượng nhỏ các luồng cho nhiều tác vụ nhỏ. Ở đây bạn sử dụng trình xử lý 2 luồng cho 2 tác vụ. Tôi sẽ tạo ra một thực thi được xác định trên toàn cầu, hoặc chỉ sinh ra 2 luồng cho 2 nhiệm vụ.

Các vấn đề liên quan