gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:00:08 26 4
gpt4 key购买 nike

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

问题:

当第二个线程正在等待将某些内容放入队列时,它似乎没有运行,我将尝试显示这一点。

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

_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;
}
}

最佳答案

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

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

在上面的示例中,存在所谓的数据竞争。这意味着 Java 编程语言不保证执行顺序一致。还是有一些保证的。然而,它们相当复杂。

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

关于java - 虽然线程中的循环似乎没有运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22741878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com