实际上,我使用一个线程在一个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) {
}
}
}
我的观察:
如果我从上面的代码中取消注释第27行,则它可以正常工作。为什么?
如果我不希望第27行上的此SOP语句。我只想检查LinkedList是否为空,如果不为空,那么我想从中轮询。我该如何解决这种情况?
最佳答案
对于这种功能,您应该使用线程安全的结构,例如BlockingQueue
。具体来说,您可以使用poll(long,TimeUnit)方法。
添加sop
可以解决此问题的原因是,每次在循环周围都会增加一个小的延迟。如果没有延迟,那么您实际上将处于紧密循环中,而没有给予JVM任何切换线程的机会。
关于java - java LinkedList的LinkedList.isEmpty()方法不能正常工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45835616/