2017-04-03 36 views
1

我想要使用可以被多線程代碼持續使用的數據結構。請讓我知道在Java中的任何數據結構,我可以等待並使用通知選項。請看看下面的代碼,爲什麼CDRemove的run方法亙古不打印的所有值Java Mulithreaded CopyONWriteArrayList

public class ConcurrencyDemo { 

    public static void main(String[] args) throws InterruptedException { 
     CopyOnWriteArrayList<String> threadSafeList = new CopyOnWriteArrayList<String>(); 
     CDInsert cd1 = new CDInsert(threadSafeList); 
     CDRemove cr1 = new CDRemove(threadSafeList); 
     cd1.start(); 

     cr1.start(); 
    } 
} 

class CDInsert extends Thread 
{ 
    List threadSafeList; 

    public CDInsert(List threadSafeList) { 
     this.threadSafeList = threadSafeList; 
    } 

    public void run() 
    { 
     int counter = 0; 
     while(counter < 20){ 
      counter++; 
      threadSafeList.add(String.valueOf(counter)); 
      System.out.println("Counter value is "+counter); 
     } 
    } 

    public void showItem(){ 
     Iterator<String> failSafeIterator = threadSafeList.iterator(); 
     while(failSafeIterator.hasNext()){ 
      System.out.printf("Read from CopyOnWriteArrayList : %s %n", failSafeIterator.next()); 
     } 
    } 
} 

class CDRemove extends Thread { 
    List threadSafeList; 

    public CDRemove(List threadSafeList) { 
     this.threadSafeList = threadSafeList; 
    } 

    public void run(){ 

     Iterator<String> failSafeIterator = threadSafeList.iterator(); 
     System.out.println("Fail Safe Iterator is "+failSafeIterator); 
     while(true){ 
      System.out.println("Fail Safe Iterator is "+failSafeIterator); 
      while(failSafeIterator.hasNext()){ 
       System.out.printf("Read from CopyOnWriteArrayList : %s %n", failSafeIterator.next()); 
      } 
     } 
    } 
} 
+0

爲什麼你認爲它應該顯示所有的項目?你的推理是什麼? –

+0

CopyOnWrite並不是一個便宜的選項。 java.util.concurrent使一些事情更容易,但仍需要了解線程和同步。它會在每次修改時對數據進行全新複製 – efekctive

回答

1

線程CDRemove有一個無限循環:

while(true){ // Change this. 
    while(failSafeIterator.hasNext()){ 
     System.out.printf("Read from CopyOnWriteArrayList : %s %n", failSafeIterator.next()); 
    } 
    } 

現在建造時,迭代器將代表名單的狀態。如果CDInsert線程仍在運行,則迭代器不會包含所有元素。

相關問題