实际上,我使用一个线程在一个LinkedList中插入元素,另一个线程从LinkedList()中删除这些元素。在删除之前我想检查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) {
}
}
}
我的观察结果:
答案 0 :(得分:2)
对于这种功能,您应该使用线程安全的结构,例如BlockingQueue
。具体来说,您可以使用poll(long,TimeUnit)方法。
添加sop
解决问题的原因是每次循环都会增加一点延迟。如果没有延迟,你就可以在紧密的循环中实现旋转而不给JVM任何切换线程的机会。