簡體   English   中英

當有成千上萬個動態任務時,如何使用Executor?

[英]How to use Executor when there are thousands/dynamic number of tasks?

我剛剛了解了Java的Executor,並且在考慮它是否符合我的需求。 我有一個數據庫,不斷向其中添加任務。

  1. 我SQL選擇數據庫中的所有行(任務)。 在任何時候,它們可能有100000、200、3或0。

  2. 我看到所有示例都是這樣的:

     ExecutorService taskExecutor = Executors.newFixedThreadPool(50); while(...) { taskExecutor.execute(new MyTask()); } 

    如何適應我的情況? 我不能僅實例化MyTask的100000,這將浪費大量的內存。

  3. 我應該如何等待完成並再次檢查? 我不能只是等到100000個任務完成,因為第一個任務可能會在5秒內完成,並且很長一段時間都不會使用,直到最后一個任務完成為止,所以我們會浪費時間。

一種BoundedExecutor而有效的方法是使用BoundedExecutor實現,如Brian Goetz在Java Concurrency In Practice中所展示的BoundedExecutor Github鏈接 )。

Github鏈接上提供了實現,但一個好的起點還需要進行一些更改

  1. 如果要訪問任務的返回值,請確保您的任務實現Callable接口而不是Runnable
  2. 使用ExecutorService代替Executor會更加有益,因為它有助於我們公開更精細的關閉功能。
  3. 公開允許徹底關閉執行程序的方法集。 這些關閉調用實現可以根據需要簡單地委派給基礎ExecutorService.shutdown()ExecutorService.shutdownNow()

同樣,最好將bound保留為配置參數-這樣,在初始化有界執行器時,可以從該配置參數中讀取可以並行安全執行的任務數。

可以根據您的性能和規模測試來調整此配置參數,以在不降低應用程序性能或基礎系統性能的情況下確定應用程序的最佳范圍。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM