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が空であるかどうかチェックしたいだけです。空でない場合は、それからポーリングします。 どのように私はこの状況を達成することができますか?
複数スレッドからスレッドセーフでないデータ構造を読み書きしています。それはおそらく信頼できるものではありません。スレッド安全性、アトミシティ、同期などについて学ぶ必要があります。 –
@ JBNizet-わかりました。私は状況を理解していますが、この問題をどのように克服できますか? – kit
Javaスレッドの同期を検索すると、多くのドキュメントや技術があります。 https://www.tutorialspoint.com/java/java_thread_synchronization.htm –