实际上,我使用一个线程在一个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/

10-12 20:34