2015-11-15 138 views
0

我有一個程序,如下所示。我想要三個併發線程使用線程同步將不同的字符串添加到infiList(「This」,「is」,「infinite」)。例如:多線程|| Java

我想附加某些線程,例如;

  • 如果infiList的最後一個字是當前「這個」,該線程應該追加詞「是」 infiList

  • 如果infiList中的最後一個字詞當前爲「is」,則線索應在「infiList」上附加單詞「infinite」。

  • 如果infiList中的最後一個詞當前是「無限」,或者infiList仍然爲空,則該線程應該在infiList附加單詞「This」。

  • infiList在任何時候只應在列表的開頭或直接在「無限」出現之後包含「This」,在列表中直接出現「This」之後應該在列表中出現「is」 「無限」應該 只發生在「是」之後。

任何有關如何做到這一點的幫助表示讚賞。

import java.util.ArrayList; 

public class Multithreading implements Runnable { 

public static ArrayList<String> infiList = new ArrayList<>(); 

@Override 
public void run() { 
    for (int i=0; i<100; i++) { 
     String s = null; 
     synchronized (infiList) { 
      if(infiList.isEmpty()) 
       infiList.add("This"); 
      else 
      { 
       s = infiList.get(infiList.size()-1); 

      if(s.equals("This")) 
       infiList.add("is"); 
      else if(s.equals("is")) 
       infiList.add("infinite"); 
      else if(s.equals("infinite")) 
       infiList.add("This"); 
      } 
     } 
    } 
} 

public static void main (String args[]) { 
    // Create three concurrent threads 
    new Thread(new Multithreading()).start(); 
    new Thread(new Multithreading()).start(); 
    new Thread(new Multithreading()).start(); 

} 
} 

回答

1

非常天真的快速解決問題。同步將獲得一個鎖,在arraylist,檢查元素,並根據您的規則插入它。但是由於你的邏輯取決於最後一個元素,同時向元素添加元素,同時維護元素的順序,這實際上不是多線程的,而是一個順序程序。

這只是因爲,當多線程程序運行時,您並不在乎排序順序,因爲您永遠無法保證它。在大多數情況下,您將進入分割和征服者樣式算法,其中算法將被拆分成片段並進行計算。

@Override 
public void run() { 
    for(int i = 0; i < 100; i++) { 
     String s = null; 
     synchronized (infiList) { 
      if(infiList.isEmpty()) 
       infiList.add("This"); 
      else 
      { 
       s = infiList.get(infiList.size()-1); 

      if(s.equals("This")) 
       infiList.add("is"); 
      else if(s.equals("is")) 
       infiList.add("infinite"); 
      else if(s.equals("infinite")) 
       infiList.add("This"); 
      } 
     } 
    } 
} 

如何利用多線程

如果我們在另一種情況下,你需要你把它放入數組之前計算的東西看你的榜樣。這可能會導致更好地利用多線程性能。

@Override 
public void run() { 
    while (true) { 
     String s = null; 

     CalculateSomethingBig(); 

     synchronized (infiList) { 
      ... 
     } 
    } 
} 

如果我們用這種思想發揮,這一次運行時處於內CalculateSomethingBig(),它將會利用更多的多任務處理能力的計算機,因爲更多的線程將使用時間來計算,並利用處理能力,然後等待在被釋放的鎖上。

如何獲得輸出

public static void main(String args[]) { 
    // Create three concurrent threads 
    new Thread(new Multithreading()).start(); 
    new Thread(new Multithreading()).start(); 
    new Thread(new Multithreading()).start(); 

    for(String s : infiList) 
     System.out.println(s); 
} 
+0

當我嘗試運行此,我得到多個錯誤'「異常線程‘線程0’顯示java.lang.NullPointerException \t在Multithreading.run(多線程.java:17) \t at java.lang.Thread.run(Unknown Source)「' –

+0

但是你的循環將永遠運行...或者可能是無限的:) –

+0

你的代碼永遠不會執行你有while while(true) –