gpt4 book ai didi

java - 线程已停止,但仍使用错误的 boolean 值运行(Java)

转载 作者:行者123 更新时间:2023-12-03 12:59:25 25 4
gpt4 key购买 nike

所以我写的程序如下:

import java.util.Random;
import java.util.Scanner;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class JustAClass{

private volatile static boolean tof=true;

private static void stop(){
tof=false;
}

private static BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(10);

private static void producer() throws InterruptedException{
while(tof){
Random random = new Random();
queue.put(random.nextInt(100));
System.out.println("........");
}
}
private static void consumer() throws InterruptedException{
while(tof){
Random random = new Random();
Thread.sleep(100);
if(random.nextInt(10)==0){
Integer value = queue.take();

System.out.println("Value taken: "+value+"; Queue size: "+queue.size());
}
}
}



public static void main(String[] args) throws InterruptedException{

Scanner scanner = new Scanner(System.in);
System.out.println("Press Enter to terminate");

Thread t1 = new Thread(new Runnable(){
public void run(){
try {
producer();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});

Thread t2 = new Thread(new Runnable(){
public void run(){
try {
consumer();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();

scanner.nextLine();
stop();

t1.join();
t2.join();

System.out.println("Terminated");
}
}

控制台通常显示以下内容:
Press Enter to terminate
........
........
........
........
........
........
........
........
........
........
........
Value taken: 58; Queue size: 10
Value taken: 53; Queue size: 9
........
Value taken: 9; Queue size: 9
........

一旦按下Enter键,程序必须终止。尽管输出停止,但不会出现消息“Terminated”。这必须意味着线程必须仍在运行。我哪里做错了?
另外,在某些情况下,会出现消息“Terminated”,并且线程停止。为什么?

最佳答案

在这里添加行,

System.out.println(t1.getState()+" "+t2.getState()+" "+queue.size());
t1.join();
t2.join();

您会明白的。生产者正在等待,因为队列大小为10。要使其继续,大小必须小于10。因此,有时您的情况
 if(random.nextInt(10)==0){
Integer value = queue.take();

System.out.println("Value taken: "+value+"; Queue size: "+queue.size());
}

可能变为真,并且可能会再次进入“运行”模式。在剩下的时间里,它将一直保持等待状态,因此您的主线程也将一直等待。

关于java - 线程已停止,但仍使用错误的 boolean 值运行(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45128809/

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