2013-03-15 49 views
4

作爲通過一些面試問題的一部分,我發現了以下問題。使用n個線程按順序打印數字

給出一個段落,其中包含n個單詞,給出m個線程。你需要做的是,每個線程應該打印一個單詞並將控制權交給下一個線程,這樣每個線程將繼續打印一個單詞,以防末線程到來時,它應該調用第一個線程。打印將重複,直到所有單詞打印在段落中。最後,所有線程都應該優雅地退出。什麼樣的同步將使用?

由於問題測試如何協調線程和共享變量之間的關係,我正在考慮用數字代替單詞。

我的方法是我將有N個線程的N個鎖對象。每個線程將被賦予一個鎖對象和下一個線程的鎖對象。我將首先鎖定我的鎖對象,然後在該監視器中,我將再次鎖定下一個線程鎖對象,然後通知它,然後等待我自己的鎖。

下面是代碼

public class PrintNThreads { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 

    int n = 10; 
      if(n < 2) 
        return; 
    Object[] lockObjects = new Object[n]; 
    for(int i=0;i<n;i++) 
    { 
     lockObjects[i] = new Object(); 
    } 

    for(int i=0;i<n;i++) 
    { 
     new NumberThread("Thread-"+(i+1), lockObjects[i], lockObjects[(i+1)%n]).start(); 
    } 

} 

} 

class NumberThread extends Thread 
{ 

static volatile int i = 0; 

static void printIncrement(String threadName) 
{ 
    System.out.println(threadName+" "+(++i)); 
} 

Object thisLock; 
Object nextLock; 
final String threadName; 

public NumberThread(String threadName,Object thisLock, Object nextLock) { 
    this.nextLock = nextLock; 
    this.thisLock = thisLock; 
    this.threadName = threadName; 
} 

public void run() 
{ 
    while(true) { 
    synchronized (thisLock) { 
     synchronized (nextLock) { 
      nextLock.notify(); 
      printIncrement(threadName); 
     } 
     try { 
      thisLock.wait(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     } 
    } 
} 
} 

我看到的輸出始終在序列和線程順序。

Output: 
Thread-1 1 
Thread-2 2 
Thread-3 3 
Thread-4 4 
Thread-5 5 
Thread-6 6 
Thread-7 7 
Thread-8 8 
Thread-9 9 
Thread-10 10 
Thread-1 11 
Thread-2 12 
Thread-3 13 
Thread-4 14 
Thread-5 15 
Thread-6 16 
Thread-7 17 
Thread-8 18 
Thread-9 19 
Thread-10 20 

請查看我的代碼並讓我知道您的建議。在多線程問題的情況下,我們不能輸出。

+6

爲什麼每個人的第一件事,無論是試圖與線程做或者被要求用線程做一些事完全並徹底擊敗無論是有或使用線程的第一個地方?! – 2013-03-15 06:04:59

+0

這是什麼樣的採訪?檢查你是否有能力濫用線程?無論如何,你的代碼對我來說確實很好。 – 2013-03-15 06:07:37

+0

爲什麼使用多個線程,如果他們必然運行。您無法爲每個自己的鎖對象同步多個線程。 – 2013-03-15 06:08:15

回答

0

我寧願使用join方法代替自己的鎖。

如果您需要一組線程活着,直到所有的字被讀出想想 CyclicBarrier

+0

代碼會看起來更整潔。 – mostruash 2013-03-15 06:40:42

+1

加入將等待其他線程死亡,但我不希望另一個線程死亡我希望它等待 – 2013-03-15 06:41:20