gpt4 book ai didi

java - 使用 7 个线程生成无限数字序列

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

我正在尝试使用 Java 中的不同线程生成无限的数字序列。这是我的代码:

import java.util.*;

public class infinite_Streams {
volatile boolean keepGenerating = true;
volatile ArrayList<Integer> s1 = new ArrayList<>();
Object lock1 = new Object();
Random random = new Random();
ArrayList<Object> obj1 = new ArrayList<>();


void generateInfiniteStream() {

synchronized (lock1) {

//BLOCK 1
while(keepGenerating) {
Object temp = Thread.currentThread().getId();
System.out.println("Thread is : " + temp);
s1.add(random.nextInt(11));
}
}
//BLOCK 1 ENDS

//BLOCK 2

// for (int i = 0; i < 100000; i++) {
// Object temp = Thread.currentThread().getId();
// System.out.println("Thread is : " + temp);
// s1.add(random.nextInt(11));
// }
//BLOCK 2 ENDS
}

void generateThreads(int num_threads){
Thread[] threads = new Thread[num_threads];

for(int i = 0 ; i < num_threads ; i++){
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
generateInfiniteStream();
}
});
}

for (Thread thread : threads) {

thread.start();
}


try{
for (Thread thread : threads) {
thread.join();
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
public void shutdown(){
keepGenerating = false;
}


public static void main(String [] args){
List<Integer> l1 = new ArrayList<>();
int num_threads = 7;
Scanner scan1 = new Scanner(System.in);
infinite_Streams is1 = new infinite_Streams();

is1.generateThreads(num_threads);
System.out.println("Press any key to interrupt");
Scanner scan2 = new Scanner(System.in);
scan2.nextLine();
is1.shutdown();
}
}

该代码似乎确实生成了我需要的内容。但我也有兴趣了解不同的线程是如何参与的。为了查看这个,我打印了(可以在 \\BLOCK1 中看到)

Object temp = Thread.currentThread().getId();
System.out.println("Thread is : " + temp);

问题是我只看到一个特定的线程,比如12,所以输出看起来总是Thread is: 12。另一方面,如果我注释 \\BLOCK1 代码并运行 \\BLOCK2 代码(生成有限数量的数字),我会看到不同的线程号,在预期的输出中。喜欢线程是:12线程是:12线程是:14ETC。有人可以解释一下,为什么我在生成无限数量时没有看到不同的线程数量?

最佳答案

其中一个线程获得锁。然后它会执行 while(keepGenerate) 直到您更改此变量。所有其他线程都在等待,直到锁被释放。当您将 keepGenerate 设置为 false 时,正在运行的线程将完成循环。其他线程之一获得锁。但此时 keepGenerate 已经为 false,因此它不会执行此循环并直接退出。然后下一个线程获得锁并再次发现没有什么可做的。等等

所以实际上只有一个线程正在生成随机数。

如果您希望每个线程生成随机数,您应该使用while(keepGenerate)而不是同步块(synchronized block)内,而是在其外部,如下所示:

while(keepGenerating) {
synchronized (lock1) {
Object temp = Thread.currentThread().getId();
System.out.println("Thread is : " + temp);
s1.add(random.nextInt(11));
}
}

然后每个线程都不会永远获得锁,而只是为了数字生成和输出的单次执行。然后锁将被释放,其他线程可以获取它,等等。

关于java - 使用 7 个线程生成无限数字序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59918380/

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