2017-08-23 8 views
0

実際には、1つのスレッドを使用して1つのLinkedListに要素を挿入し、別のスレッドがLinkedList()からこれらの要素を削除しています。削除する前に、LinkedListに要素が含まれているかどうかチェックしたいので、LinkedList.isEmpty()メソッドを使用していますが、期待通りの動作をしていません。 私はその背後にある理由を知りたい!java LinkedListのLinkedList.isEmpty()メソッドが正しく機能していませんか?

import java.util.LinkedList; 

public class Demo { 

    private LinkedList li; 

    private Demo() { 
     li = new LinkedList(); 
    } 

    public void insert() { 
     for (int i = 0; i <= 100; i++) { 
      li.add(i); 
      System.out.println("inserted : " + i); 
      try { 
       Thread.sleep(2000); 
      } catch (InterruptedException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 

    public void remove() { 
     while (true) { 
      if (li.isEmpty()) { 
       //System.out.println("this statement has no significance..."); // Line Number 27 
      } else { 
       int a = (int) li.poll(); 
       System.out.println("removed : " + a); 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } 
    } 

    public static void main(String[] args) { 
     final Demo main = new Demo(); 
     Thread t1 = new Thread() { 
      @Override 
      public void run() { 
       main.insert(); 
      } 
     }; 
     t1.start(); 

     Thread t2 = new Thread() { 
      @Override 
      public void run() { 
       main.remove(); 
      } 
     }; 
     t2.start(); 
     while (true) { 

     } 
    } 

} 

私の観察::私は上記のコードから行番号27のコメントを解除した場合、それが正常に動作している

  • は、ここに私のサンプルコードです。 なぜですか?

  • このSOPステートメントが行番号27に表示されないようにするには、LinkedListが空であるかどうかチェックしたいだけです。空でない場合は、それからポーリングします。 どのように私はこの状況を達成することができますか?
+3

複数スレッドからスレッドセーフでないデータ構造を読み書きしています。それはおそらく信頼できるものではありません。スレッド安全性、アトミシティ、同期などについて学ぶ必要があります。 –

+0

@ JBNizet-わかりました。私は状況を理解していますが、この問題をどのように克服できますか? – kit

+0

Javaスレッドの同期を検索すると、多くのドキュメントや技術があります。 https://www.tutorialspoint.com/java/java_thread_synchronization.htm –

答えて

2

このような機能の場合は、BlockingQueueなどのスレッドセーフ構造を使用する必要があります。具体的にはpoll(long,TimeUnit)メソッドを使用できます。

sopを追加する理由は、ループのたびに小さな遅延が追加されるためです。遅れがなければ、JVMにスレッドを切り替える機会を与えることなく、タイトなループで効果的に回転します。

関連する問題