我一直在研究一个有两个线程的小项目。 一个生成内容并将其放在队列中(在静态上下文中)。 另一个线程运行并等待队列中的内容执行某些操作。
问题:
当第二个线程正在等待某些东西被放入队列时,它似乎没有运行,我会尝试显示它。
我只是好奇这里发生了什么。
_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;
}
}
答案 0 :(得分:1)
LinkedList非线程安全。你必须锁定你自己。
答案 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 。或者您应该在代码中使用一些同步机制,例如同步块。