2009-05-12 28 views
24

Tôi đang cố gắng để có được một xử lý về cách thực hiện luồng trong một ứng dụng Java có sử dụng Spring để quản lý giao dịch. Tôi đã tìm thấy phần TaskExecutor trong Spring documentation, và ThreadPoolTaskExecutor trông giống như nó sẽ phù hợp với nhu cầu của tôi;Bất kỳ luồng Spring tốt nào với một ví dụ TaskExecutor?

ThreadPoolTaskExecutor

thi này chỉ có thể được sử dụng trong một môi trường Java 5 mà còn là một trong những phổ biến nhất được sử dụng trong môi trường đó. Nó cho thấy các thuộc tính bean để cấu hình một java.util.concurrent.ThreadPoolExecutor và kết thúc nó trong một TaskExecutor. Nếu bạn cần một cái gì đó nâng cao như một ScheduledThreadPoolExecutor, bạn nên sử dụng ConcurrentTaskExecutor thay thế.

Tuy nhiên tôi không biết cách sử dụng nó. Tôi đã tìm kiếm các ví dụ tốt cho một lúc bây giờ mà không có may mắn. Nếu bất cứ ai có thể giúp tôi, tôi sẽ đánh giá cao nó.

Trả lời

33

Nó khá đơn giản. Ý tưởng là bạn có một đối tượng thi hành là một bean, được truyền vào bất kỳ đối tượng nào muốn kích hoạt nhiệm vụ mới (trong một chủ đề mới). Điều thú vị là bạn có thể sửa đổi loại thực thi tác vụ nào chỉ sử dụng bằng cách thay đổi cấu hình Spring. Trong ví dụ dưới đây tôi lấy một số lớp ví dụ (ClassWithMethodToFire) và gói nó trong một đối tượng Runnable để thực hiện lửa; bạn cũng có thể thực thi Runnable trong một lớp của riêng bạn, và sau đó trong phương thức thực thi bạn chỉ cần gọi classWithMethodToFire.run().

Đây là một ví dụ rất đơn giản.

public class SomethingThatShouldHappenInAThread { 
    private TaskExecutor taskExecutor; 
    private ClassWithMethodToFire classWithMethodToFire; 

    public SomethingThatShouldHappenInAThread(TaskExecutor taskExecutor, 
               ClassWithMethodToFire classWithMethodToFire) { 
      this.taskExecutor = taskExecutor; 
      this.classWithMethodToFire = classWithMethodToFire; 
    } 

    public void fire(final SomeParameterClass parameter) { 
      taskExecutor.execute(new Runnable() { 
       public void run() { 
        classWithMethodToFire.doSomething(parameter); 
       } 
      }); 
    } 
} 

Và đây là đậu mùa xuân:

<bean name="somethingThatShouldHappenInAThread" class="package.name.SomethingThatShouldHappenInAThread"> 
    <constructor-arg type="org.springframework.core.task.TaskExecutor" ref="taskExecutor" /> 
    <constructor-arg type="package.name.ClassWithMethodToFire" ref="classWithMethodToFireBean"/> 
</bean> 

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <property name="corePoolSize" value="5" /> 
    <property name="maxPoolSize" value="10" /> 
    <property name="queueCapacity" value="25" /> 
</bean> 
+0

Tôi nghĩ rằng vấn đề của tôi là suy nghĩ này là phức tạp hơn sau đó nó được. Tôi thấy http://docs.huihoo.com/javadoc/spring/2.0/org/springframework/scheduling/concurrent/ThreadPoolTaskExecutor.html#createQueue(int) và tôi giả định ThreadPoolTaskExecutor có một cơ chế xếp hàng được xây dựng sẵn. –

+0

Có lẽ tôi đã không nhầm, queueCapacity là gì? Tôi vẫn cảm thấy như tôi đang thiếu cái gì đó ở đây. –

+12

Nếu dung lượng hàng đợi lớn hơn 0, nó tạo ra một hàng đợi, để các tác vụ được kích hoạt bởi một TaskExecutor cụ thể có thể đợi cho đến khi một luồng có sẵn từ nhóm. Dung lượng cho biết có bao nhiêu khoảng trống trong hàng đợi. Nếu hàng đợi lấp đầy, người thực thi sẽ chặn (tức là phương thức thực thi sẽ không trở lại cho đến khi một khoảng trống mở ra). Đây là tài liệu trên hàng đợi: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/LinkedBlockingQueue.html –

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