簡體   English   中英

如何設置兩個彼此相鄰的線程池?

[英]How do you set up 2 threadpools that work next to eachother?

我有一個關於線程池的問題。

這是我遇到的情況:從后端服務的某個地方,我們會收到一份pdf文件列表。
首先需要將這些pdf頁面一個一個地轉換為.bmp文件。
進行此轉換后,需要打印這些bmp。

問題是轉換和打印任務都需要花費一些時間才能完成,因此我想使此過程更快,因為在其他人看到打印機中有東西出來之前,還需要一段時間。

我考慮過的一個解決方案是創建2個ThreadPool:一個用於轉換內容,另一個用於打印內容。

這些將是我的線程池:

ExecutorService convertPool = Executors.newFixedThreadPool(10);

ExecutorService printPool = Executors.newSingleThreadExecutor();

具有10個線程的convertPool ,用於將pdf頁面轉換為bmps。
完成此操作后,創建的bmp將發送到printPool。 這是一個單線程,因為始終只能進行一次打印。

但是現在我的問題是:
因此convertPool已完成了第一個pdf的工作,並將所有未來任務發送到PrintPool進行打印。
但是,當printPool忙時,我希望convertPool已經從第二個pdf開始。 這樣,當PrintPool完成后,便可以從第一個pdf打印bmp,因此可以立即開始處理第二個pdf的bmp打印,因為已經創建了這些文件。

但是如何設置這種機制? 有人可以幫我嗎?

謝謝!

  • 您可以使用同一執行程序來執行可運行的打印作業。
  • 在該可運行變量中,您可以引用執行實際處理PDF的可調用對象產生的期貨列表。
  • 該列表當然具有全球參考意義。
  • 現在您可以使用具有有限許可的信號量,例如(10),而任何可調用的信號量
    結束執行后,它可以釋放一個可運行的許可證
    嘗試事先獲取並保持在阻止狀態,因為沒有可用的狀態。

    注意:每個PDF處理Callable都會在執行開始時獲得許可。

  • 您的可運行對象可以在訪問任何將Done()的狀態返回為true並可以在迭代末尾釋放許可證的未來之前,先嘗試獲取許可證。

  • 所有任務都已完成執行,或者當10個許可證再次可用時,您可以通過執行shutdownNow()終止執行程序,從而終止可運行程序。

希望能幫助到你 !

您走在正確的軌道上。 您可以根據需要向轉換器池提交任意數量的轉換任務。 它將盡快執行它們,並將那些還不能由線程服務的隊列排隊。 每個轉換任務完成后,它可以將自己提交給打印池,該打印池還將根據需要將任務排隊。 這是我的意思的基本骨架:

class Conversion implements Runnable {
    Consumer<Conversion> onCompletion;

    Conversion(Consumer<Conversion> onCompletion) {
        this.onCompletion = onCompletion;
    }

    @Override
    public void run() {
        // ... conversion code. You could Thread.sleep()
        // here to simulate the conversion work taking up
        // some time.

        // (now we're done converting)
        onCompletion.accept(this);
    }
}

class Print implements Runnable {
    Print(Conversion c) {
        // ...
    }

    // ...run() method, etc.
}

// Example of submitting a conversion task to the executor
convertPool.submit(new Conversion(c -> printPool.submit(new Print(c))));

暫無
暫無

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

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