实际上,我正在使用一个线程在一个 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
。具体来说,您可以使用轮询(long,TimeUnit(方法。
添加sop
可以解决此问题的原因是,每次循环都会增加一个小的延迟。如果没有延迟,您就可以有效地在紧密循环中旋转,而不会给 JVM 任何切换线程的机会。