java LinkedList的LinkedList.isEmpty()方法无法正常工作?

时间:2017-08-23 09:20:07

标签: java linked-list

实际上,我使用一个线程在一个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是否为空,如果不为空,那么我想从中进行轮询。 我如何才能实现这种情况?

1 个答案:

答案 0 :(得分:2)

对于这种功能,您应该使用线程安全的结构,例如BlockingQueue。具体来说,您可以使用poll(long,TimeUnit)方法。

添加sop解决问题的原因是每次循环都会增加一点延迟。如果没有延迟,你就可以在紧密的循环中实现旋转而不给JVM任何切换线程的机会。