2013-12-10 13 views
0

我正在實現用於線程池的定製FutureTask(不擴展),等等。我需要特殊功能,並且不能直接根據FutureTask的方法進行擴展。爲了幫助我做到這一點,我查看了默認實現。你可以在這裏看到默認的實現中,如果您無法訪問代碼:Java AbstractQueuedSynchronizer與定製FutureTask的自定義同步?

http://pastebin.com/HTe6WT9S

正如你所看到的,它使用AbstractQueuedSynchronizer。我的問題只是爲什麼?這個類是超級優化還是主要是FIFO功能,這是有吸引力的?我最初的想法是實現我的自定義FutureTask使用AtomicInteger和其他低級構造,使用我的良好同步構造的平均知識來實現​​我的FutureTask優化,所以我可能不希望AQS的更慢的功能,如果有的話。那麼有沒有其他功能AQS提供?有什麼好的論據來反對使用它?這是我有限的猜測至今:

AQS *也許事實上的標準,因爲這是你應該在一般情況下(親) *可複製的大部分代碼(PRO) * FIFO功能,使用什麼很有意思,但是FutureTask是否可取? (中立) *也許它的特性使它比低級構造慢? (con) AtomicInteger &其他低級構造 *可能儘可能快地獲得? (親) *必須實現自我((次要)con) *沒有FIFO(con)

回答

1

我剛纔回答了what's AQS used for。請先閱讀。

A FutureTask實例可以由許多不同的線程保存。例如:

final FutureTask<Beef> killCows = new FutureTask<Beef>(
      new Callable<Beef>() { 

       @Override 
       public Beef call() throws Exception { 
        return new Beef(); 
       } 
      }); 

    new Thread(new Runnable() { 

     @Override 
     public void run() { 

      Beef beef = killCows.get(); 
      // prepare sirloin 

     } 
    }).start(); 

    new Thread(new Runnable() { 

     @Override 
     public void run() { 

      Beef beef = killCows.get(); 
      // prepare rib 

     } 
    }).start(); 

所有調用FutureTask.get()將等待的線程(阻塞),直到任務完成或取消。必須有一些機制來通知並喚醒它們。所以答案是AQS。正如你所提到的,它確實產生了一個FIFO隊列,隊列中的每個節點代表一個線程。一旦任務完成,所有節點將被通知並有權逐一訪問關鍵部分。

請不要製作另一個FutureTask,但首先要理解它。也許你可以重寫那些受保護的方法,如done()來完成你的工作。

+0

恐怕我不能 - 我已經基本上看過所有這些機會,但我必須實現我自己的。但非常感謝您的幫助! – bombax

+0

@bombax作爲另一個問題,您可能會談論更多關於您的需求。讓我們來看看它是否需要一個新的FutureTask。 – Anderson

+0

謝謝!需求和所有血淋淋的細節,包括所有這些背後的動機,就在這裏:http://stackoverflow.com/questions/20552211/java-swing-halting-the-event-dispatch-thread-activity-temporarilyvv7 #20552211 – bombax