gpt4 book ai didi

java - 使用同步方法改变输出

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

我已经编写了一个多线程和同步递增函数,但它没有显示一致的输出:-

$ java Main
count: 999883

$ java Main
count: 1000000

$ java Main
count: 999826

$ java Main
count: 1000000

$ java Main
count: 1000000

我有一个同步计数器:-

public class Counter {
public int count;
synchronized void inc() {
count = count+1;
}
int getCount() {
return count;
}
}

用计数器对象初始化并将其递增 1000 次的线程类:-

public class CountPrimesRunnable implements Runnable {
private Counter c;

public CountPrimesRunnable(Counter c) {
this.c = c;
}

public void run() {
for (int i = 0; i < 1000; i++)
c.inc();
}
}

以及一次创建 1000 个线程的 Main 类:-

public class Main {
public static void main(String[] args) {
int numberOfThreads = 1000;
Thread[] worker = new Thread[numberOfThreads];
Counter c = new Counter();
for (int i = 0; i < numberOfThreads; i++)
worker[i] = new Thread(new CountPrimesRunnable(c));

for (int i = 0; i < numberOfThreads; i++)
worker[i].start();

System.out.println("count: " + c.count);
}
}

我缺少什么?

最佳答案

but it doesn't show a consistent output :-

那是因为,从您的代码中无法确定 main 线程是否总是会在所有其他线程完成其工作后完成。在某些情况下,您得到的结果小于 1000000,这是在主线程完成后某些线程仍在执行的情况。

您可以调用 Thread#join()每个新创建的线程上的方法,以确保 main 方法等待所有这些线程结束,然后在 for 循环之后继续执行。

因此,您必须添加另一个 for 循环以在每个启动的线程上调用 join,并且您还可以避免使用第二个 for 循环,方法是将其与第一个 for 循环合并:

for (int i = 0; i < numberOfThreads; i++) {
worker[i] = new Thread(new CountPrimesRunnable(c));
worker[i].start();
}

for (int i = 0; i < numberOfThreads; i++) {
worker[i].join();
}

当您从 Thread B 内部调用 Thread A 上的 join 时,Thread B 将继续只有在 Thread A 结束后才会进一步执行。

关于java - 使用同步方法改变输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14918421/

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