虽然线程中的循环似乎没有运行

时间:2014-03-30 08:28:17

标签: java multithreading parallel-processing

我一直在研究一个有两个线程的小项目。 一个生成内容并将其放在队列中(在静态上下文中)。 另一个线程运行并等待队列中的内容执行某些操作。

问题:

当第二个线程正在等待某些东西被放入队列时,它似乎没有运行,我会尝试显示它。

我只是好奇这里发生了什么。

_slices是一个队列:Queue<E> _slices = new LinkedList<E>();

线程2 run()

while ( true ) {
    if ( !Main._slices.isEmpty() ) {
            System.out.println( "Something in the Queue!" );
       } else if ( Main.doneQueuing ) {
            break;
       }
}

将一个元素添加到队列后,上面的代码将不会执行任何操作。


现在,此代码有效:

while ( true ) {
    System.out.println( "As long as a process is done here it works" );
    if ( !Main._slices.isEmpty() ) {
            System.out.println( "Something in the Queue!" );
       } else if ( Main.doneQueuing ) {
            break;
       }
}

2 个答案:

答案 0 :(得分:1)

LinkedList非线程安全。你必须锁定你自己。

让我们试试ConcurrentLinkedQueueLinkedBlockingQueue

答案 1 :(得分:1)

根据提供的信息,我只能猜测。我想你的代码如下所示。数据结构_slices在线程之间共享,有一个方法 push ,它将一个元素添加到共享数据结构并在一个线程中执行。并且有一个方法 poll 检查数据结构是否为空,并在另一个线程中执行。

class Foo {
    Queue<String> _slices = new ArrayDeque<>();
    void push(String element) {
        _slices.add(element);
    }
    void poll() {
        while (!_slices.empty()) {
            // ...
        }
    }
}

在上面的示例中,有一个所谓的数据竞赛。这意味着Java编程语言不保证执行顺序是一致的。还有一些保证。但是,它们非常复杂。

为了避免数据竞争,您应该使用支持并发的数据结构,例如: ConcurrentLinkedQueue LinkedBlockingQueue 。或者您应该在代码中使用一些同步机制,例如同步块。