2013-02-22 41 views
2

啓動線程在一次採訪中,我問了一個問題我解決不了:對於今天的條件

假設有三個線程命名爲T1,T2和T3。現在T1將 打印從1到5的數字,T2將打印從6到10的數字 和T3將打印從10到15的數字。三個線程有 由t1.start(),t2開始。 start()和t3.start(),但應執行T3 線程,然後執行T1線程,最後執行T2線程。

請告知可能的解決方法。根據我的研究,有Thread.join或循環障礙的概念。請告知最佳方法,如果可能的話,請展示一小段代碼以便更好地理解。

+4

嘗試一下。但問題有點愚蠢。在這種情況下最好的做法是重寫代碼並使用單個線程以適當的順序打印所有值,因爲沒有任何操作是並行完成的。 – 2013-02-22 17:24:48

+0

@JohnKane我同意你,但你可以請告知,如果任何如何這項要求,那麼我們將如何進行,在此先感謝 – user2094103 2013-02-22 17:36:33

+0

@JBNizet我完全同意你,請你讓我知道如果有任何如何這項要求然後如何我接近解決方案,在此先感謝。 – user2094103 2013-02-22 17:38:13

回答

0

沒有真正的最佳方法。他們很可能在尋找如何試圖回答這個問題。

當處理這樣的模糊問題時,我會首先嚐試確定他們在尋找什麼。他們是否需要按順序執行?按順序打印數字,或者需要打印(10-15),而其他兩個線程等待。或者他們只需要按照指示的順序開始打印,並在打印結束時打印出來。按照規定讀取問題似乎只是讓每個線程在按照定義的順序啓動它們之後打印出一個定義的序列。這沒有提到阻塞。你可以創建一個包裝類來保存一個優先級,將它們粘在一個有序的隊列中,然後迭代開始每個線程的集合。

我認爲他們也可能一直在尋找你說一些事實,即在這種情況下使用多個線程(假設他們想要數字順序)是沒有意義的,因爲不管其他任何兩個線程三個線程什麼都不做。只使用一個線程會更快。然後添加一些關於它的使用某種排序執行程序服務可能會更有效,其中每個線程都可以將下一個數字寫入公共排序資源中。那麼你可以設法保護隊列,以確保一次只有一個被刪除/寫入。有很多方法可以做到這一點,每個問題都有很多問題。它也可能很好地提及阻塞與非阻塞的好處/成本。由於有很多不同的方法可以做到這一點,所以只需要熟悉Concurrencys api即可。

Java中的Concurrency util classes有很好的文檔記錄,並且在大多數情況下給出了有用的示例。這是一個開始的好地方。試試看SemaphoresPhasersA Count Down Latch爲此。雖然在實踐中ExecutorsThe Fork/Join Framework可能值得多看一些。

對不起,我試圖做的一點是,沒有最好的方法來回答這樣的問題。我認爲這個問題真的是試圖看你的方法。詢問代碼示例並不能真正幫助你。花點時間坐下來閱讀一些好的教程。

3

我同意,這個問題不是很大,但你確實需要某種形式的回答...

此打印出10-15,1-5,6-10,按您的要求( T3然後T1然後T2)(順便說一句 - 應該T3實際上打印從11到15?):

public class Test { 
    static class Printer implements Runnable { 
    private final int from; 
    private final int to; 
    private Thread joinThread; 

    Printer(int from, int to, Thread joinThread) { 
     this.from = from; 
     this.to = to; 
     this.joinThread = joinThread; 
    } 

    @Override 
    public void run() { 
     if(joinThread != null) { 
     try { 
      joinThread.join(); 
     } catch (InterruptedException e) { /* ignore for test purposes */ } 
     } 
     for (int i = from; i <= to; i++) { 
     System.out.println(i); 
     } 
    } 
    } 
    public static void main(String[] args) throws InterruptedException { 

    Thread T3 = new Thread(new Printer(10, 15, null)); 
    Thread T1 = new Thread(new Printer(1, 5, T3)); 
    Thread T2 = new Thread(new Printer(6, 10, T1)); 
    T1.start(); 
    T2.start(); 
    T3.start(); 
    } 
} 

CountdownLatch也在這裏也許是一個不錯的選擇。

+1

我認爲他們可能一直在尋找控制輸出的方法,而不是僅僅啓動線程並讓它們運行。但我可能是錯的。 – 2013-02-22 17:45:55

+0

考慮了一下,並在這裏閱讀了其他一些評論,可能他們實際上是在真正的實現之後,而是期待你如此質疑有3個不同線程的需求。我認爲這是很好的一點。 – 2013-02-22 17:46:32

+0

@JohnKane同意,這是完全可能的。東西可以澄清我猜在採訪期間 – 2013-02-22 17:47:31