簡體   English   中英

while(true)循環中的Java動態列表

[英]Java dynamic list in while(true) loop

我有一個包含對象的列表,我需要在刪除或添加項目時永久性地遍歷該列表。 所有這些都應該在可運行線程中發生。 我想要的是,迭代過程永遠不會停止,而仍然能夠向其中添加新對象,並刪除完成的對象。

  • 我想從while(true)線程中從外部添加新對象。
  • 我想刪除while(true)線程中的項目。
  • 它就像一個FIFO,但是是動態的。 或就像永不停止的隊列。
  • 如果列表為空,則必須等待新對象。

這在Java中可行嗎?

您正在描述生產者/消費者模式。 Java具有實現此目的的線程安全方法。 最簡單的方法是使用java.util.concurrent.BlockingQueue<E>

使用它的方法是在使用者(線程)和一個或多個生產者線程之間共享BlockingQueue。 消費者使用方法E Queue.take() 客戶端使用Queue.offer(E)方法添加到Queue中。

首先創建BlockingQueue:

BlockingQueue<MyObject> myQueue = new LinkedBlockingQueue<MyObject>(int capacity);

服務器線程將如下所示:

    BlockingQueue<MyObject> myQueue;
    // A constructor which receives the BlockingQueue object

    // Main Loop
    boolean isInterrupted = false;

    while(!isInterrupted) {
        try {
            MyObject object = myQueue.take();   // Will block
            // Process object
        } catch (InterruptedException e) {
            isInterrupted = true;
        }
    }

對於每個生產者線程,將BlockingQueue對象傳遞給每個對象,並使用:

BlockingQueue<MyObject> myQueue;
// A constructor which receives the BlockingQueue object

// Create MyObjects
myQueue.offer(myObject);   // Will add to the queue

有一個隊列容量的概念。 如果生產者添加得太快,隊列可能會達到容量。 在這種情況下,要約可能會失敗。 有關完整詳細信息,請參見javadoc LinkedBlockingQueue

暫無
暫無

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

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