2012-09-30 22 views
2

這是一個功課。 我想創建對等網絡線程模型:Java點對點線程模式,大家等待工作

http://www.informit.com/articles/article.aspx?p=169479&seqNum=5

凡委託模型有老闆線程委託任務的工作線程,在對等網絡模型所有線程具有相同的工作狀態。儘管最初創建了執行所有任務所需的所有線程的單個線程,但該線程被視爲工作線程並且不執行委派。在這個模型中,沒有中心線程。

所以我的主線程創建預訂購5個線程,即開始聽我的隊列,並創建一個主線程工作,持續10秒。由於所有線程都必須執行任務,因此此線程也必須等待作業。我怎樣才能做到這一點?

BlockingQueue<Job> queue = new ArrayBlockingQueue<Job>(1000); 

    Collection<Thread> workers = new ArrayList<Thread>(); 
    for(int i = 0; i < 5; i++) { 
     Thread thread = new Thread(new Worker(queue)); 
     workers.add(thread); 
     thread.start(); 
    } 

    long endTime = System.currentTimeMillis() + 10000; 
    Random r = new Random(); 
    while(System.currentTimeMillis() < endTime) { 
     try { 
      CalculateJob job = new CalculateJob(r.nextInt(50), r.nextInt(50), r.nextInt(50)); 
      queue.put(job); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

所以我的主線程將創建線程工作,和工人只是queue.take()坐着。

難道我理解正確的話,在對等網絡模型中,每個線程都必須queue.take()或待業。如果是這樣,我該怎麼做?有什麼建議麼?

+0

你已經回答了你的問題:) –

+0

@AmitD是的,但是當我有我的「主」線程忙於創造新的就業機會並將它們添加到隊列中,我怎樣才能使用該線程完成作業? – Jaanus

+0

一旦一個工作線程創建所有工作,它可以調用隊列上的take()。所以你的所有工作人員都在隊列中調用take(),以便它。 –

回答

1

您鏈接到不說,如何創造就業機會的文章。他們可能意味着他們是從別處創建的。縱觀數字爲各自的模型中,我們看到:

  • 在「委託模式」,主線程決定哪些工作線程將執行工作
  • 在「點對點模式」時,對等線程從普通隊列中獲得工作(並且任何線程恰好首先獲得下一個工作),所以對等線程自行協調。

通過使用ConcurrentQueue,您實際上實現了點對點模型。總之,它們的區別在於線程如何協調工作,而不是如何創建工作。

1

的建議您提供本身

在對等網絡模型中的所有線程都有平等的工作狀態的文章。雖然最初創建執行所有任務所需的所有線程的一個線程,該線程被認爲是一個工作線程並不做任何代表團

你的老闆線程恰好是亦工將創造就業機會放在一旦完成任務,可以通過調用take()來充當隊員。

現在如果你想阻止所有線程,直到老闆線程完成創造就業機會,那麼你可以使用CountDownLatch單數。

我真的不知道這個模型是否有利於我們的生產者/消費者模型。

0

雖然這個問題被打上而且由於事實workcrew模型聽起來好像是併發的一個籠統的概念,我在C.

添加僞代碼在同行模型,也稱爲工作模型,當程序啓動時,一個線程必須創建所有其他對等線程。此線程 隨後充當另一個處理請求的對等線程,或者掛起等待其他對等方完成。同行 模型使每個線程負責自己的輸入。同儕知道自己的投入提前 ,有其自己的私人方式獲得其輸入,或與其他同儕分享單點輸入。

enter image description here

main() 
{ 
    pthread_create(... thread1 ... task1) 
    pthread_create(... thread2 ... task2) 
    . 
    . 
    . 
    signal all workers to start 
    wait for all workers to finish 
    do any clean up 
} 

task1() 
{ 
    wait for start 
    perform task, synchronize as needed if accessing shared resources 
    done 
} 

task2() 
{ 
    wait for start 
    perform task, synchronize as needed if accessing shared resources 
    done 
} 

所有源從PThreads Programming - A POSIX Standard for Better Multiprocessing, Buttlar, Farrell, Nichols引述