繁体   English   中英

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

[英]java LinkedList's LinkedList.isEmpty() method not working properly?

实际上,我使用一个线程在一个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任何切换线程的机会。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM